Mein Code ist wie unten,Was bewirkt ein Aufruf von queue.join() im Haupt-Thread auf Nicht-Haupt-Threads?
import time, queue, threading
def washer(dishes, dish_queue):
for dish in dishes:
print ("Washing", dish)
time.sleep(1)
dish_queue.put(dish)
def dryer(dish_queue):
while True:
dish = dish_queue.get()
print("Drying", dish)
time.sleep(2)
dish_queue.task_done()
print('dryer')
dish_queue = queue.Queue()
for n in range(2):
dryer_thread = threading.Thread(target=dryer, args=(dish_queue,))
dryer_thread.start()
dishes = ['salad', 'bread', 'entree', 'desert']
washer(dishes, dish_queue)
dish_queue.join()
Von meinem Verständnis in der Warteschlange Modul Dokumentation, dish_queue.join() den Haupt-Thread, bis die Anzahl der unerledigten Aufgaben blockieren (hier ist nicht getrocknetes Geschirr) auf 0 zurück. Aber ich frage mich, was mit dem 2 dryer_thread passiert ist.
Ich habe festgestellt, dass, wenn ich die Funktion dryer
auf einem leeren dish_queue
im Hauptprogramm ausführen, das Programm blockiert ist (BTW, ist dies der sogenannte Block von Dish_queue.get()?). Also, wenn dish_queue.join()
den Haupt-Thread freigibt, die 2 dryer_thread auch entsperren und den Speicher freigeben? Was bedeutet Block bedeuten sowieso in der Warteschlange doc?
Neben dem Festlegen eines Zeitlimits, was schlagen Sie vor, um die anderen Threads zu beenden? Ich bin mir nicht sicher, ob andere Threads als Daemon arbeiten. Wenn ich meinen Code nicht ändere und sie einfach blockiere, verbrauchen sie wirklich meinen Speicher? – Nicholas
BTW, welchen Parallelitätsmonitor benutzen Sie? Es ist klassisch! – Nicholas
Im Allgemeinen ist ein Thread mit einem Block der gleiche wie ein schlafender Thread. Es wird seinen Speicher nicht freigeben, aber es werden auch keine zusätzlichen Ressourcen verbraucht. Es hängt also davon ab, ob Sie den Thread in Zukunft benötigen. Zu beachten ist, dass die Threads so lange vorhanden sind, wie der Hauptthread aktiv ist. Daher sollten Sie keine neuen Threads öffnen und stattdessen neue Elemente zur vorhandenen Warteschlange hinzufügen. Ich verwende pyCharm, das ist eine großartige allround IDE. – Aruj