Der Python 3 docs ein Beispiel eines Arbeiter-Thread geben, die eine Warteschlange verwendet (https://docs.python.org/3/library/queue.html):Wann ist Queue.join() notwendig?
def worker():
while True:
item = q.get()
if item is None:
break
do_work(item)
q.task_done()
q = queue.Queue()
threads = []
for i in range(num_worker_threads):
t = threading.Thread(target=worker)
t.start()
threads.append(t)
for item in source():
q.put(item)
# block until all tasks are done
q.join()
# stop workers
for i in range(num_worker_threads):
q.put(None)
for t in threads:
t.join()
In diesem Beispiel ist, warum q.join()
notwendig? Bewirken die nachfolgenden Operationen q.put(None)
und t.join()
nicht dasselbe, den Hauptthread zu blockieren, bis die Worker-Threads abgeschlossen sind?
Das ist so, wie ich das Beispiel auch interpretiert habe. Also, meine Frage ist, wird nicht jedes Element in der Warteschlange behandelt (und alle Threads aufgeräumt), selbst wenn wir die Anweisung 'q.join()' entfernen? Wenn wir allen Worker-Threads beitreten (der letzte Schritt), warten wir immer noch darauf, dass alle Elemente in der Warteschlange behandelt werden. – SMX
Ja, wir warten immer noch, aber ich denke, es ist eine codierte Sicherheitsmaßnahme. Was, wenn die Zugabe von "None" auf wundersame Weise hinzugefügt wurde, bevor alle Gegenstände in der Warteschlange bearbeitet wurden und ein Arbeiter einen bekam? Ich denke, es ist nur ein mühsam programmiertes Beispiel, um sicherzustellen, dass Sie verstehen, was passiert, ohne dass Sie vollständig verstehen müssen, dass die Warteschlange FIFO (First In, First Out) ist. Außerdem könnte dieses Beispiel für eine LIFO-Implementierung (Last In, First Out) angepasst werden. Aber mit diesem aktuellen Beispiel glaube ich, dass Sie 'q.join()' rausnehmen könnten und es wäre in Ordnung. – jarcobi889