Hallo zusammen,
auf Anregung von meigrafd stelle ich meine Frage [1] aus dem "Wie sage ich es in Python?"-Thread nochmal in einem eigenen Beitrag.
In Ermangelung eines fertigen Codes habe ich nun mal 2 Stunden an einem Dummy gearbeitet:
counter = 0
def add_tasks():
""" Add tasks, including a task to itself
"""
global q
global counter
import time
print("Runde ", counter, ": Fuege Aufgaben zur FIFO Warteschlange hinzu")
# Beispiel: 10 Sekunden, open_valve(1)
q.put((10, open_valve, 1))
q.put((1, close_valve, 1))
q.put((10, open_valve, 2))
q.put((1, close_valve, 2))
if counter < 5:
# Funktion fuegt sich selbst der Warteschlange hinzu fuer die naechste Runde
q.put((10, add_tasks))
counter += 1
return
def open_valve(valvenum):
global counter, startzeit
import time
print("Runde ", counter, ", ", round(time.time()-startzeit, 1), " Sekunden vergangen...")
print(" Ventil ", valvenum, "geoeffnet.")
return
def close_valve(valvenum):
global counter
print(" Ventil ", valvenum, "geschlossen.")
return
def start_thread():
global q
import threading
items =q.get()
time = items[0]
func = items[1]
args = items[2:]
t = threading.Timer(time, func, [args])
t.start()
return
#### Hauptprogramm ####
import queue, threading, time
startzeit = time.time()
# Beim ersten Start die Queue anlegen und fuellen!
q = queue.Queue()
add_tasks()
print("Ab hier laufen die Schleifen")
if not q.empty():
start_thread()
Alles anzeigen
Ich möchte gerne folgendes probieren:
- Die Funktion "add_tasks" wird ausgeführt und fügt einer (globalen) Warteschlange Aufgaben hinzu.
Das wird später mal meine Berechnung für die Bewässerungsdauern. Ganz am Ende fügt sich die Funktion quasi nochmal selbst hinzu, damit wieder die Bewässerungsdauern für den nächsten Tag ausgerechnet werden. In die Queue geht ein Tupel aus Wartezeit, Funktionsname sowie ggf. Parametern. - Die beiden "open_valve" und "close_valve" Funktionen sind schlichte Aufgaben, welche nach Ablauf der Dauer ausgeführt werden.
- Die Funktion "start_thread" soll den nächsten Eintrag aus der FIFO Warteschlange nehmen und die darin gewünschte Funktion in einem separaten Thread starten.
Mein Hauptprogramm (insb. eine GUI) soll bedienbar bleiben. Daher meine Versuche mit diesen Threads.
Allerdings kriege ich es nicht hin, dass immer der nächste Thread dann gestartet wird, wenn der eine gerade beendet wurde.
Ich habe bisher nie mit Threads zu tun gehabt und vermute einen groben Verständnisfehler. Leider kann ich mit der Python-Doku auch nichts anfangen als Laie.
Kann mir mal bitte jemand (ohne Code) mit Worten beschreiben in welche Richtung ich recherchieren muss und wie das vom Grundaufbau ausschauen müsste?
Bzw, um auf die ursprüngliche Frage aus dem anderen Beitrag zurück zu kommen: muss es überhaupt Multi-Threading sein, oder geht das noch anders? (einfacher?)
Vielen Dank.
Gruß,
Marcus Zurhorst