Python3.6
Сначала я помещаю некоторые элементы в очередь, затем запускаю поток и вызываю join() очереди в основном потоке, затем вызываю get() в цикле потока, когда размер очереди == 0, я вызываю task_done() и разорвать петлю и выйти из нити. Но метод join() по-прежнему заблокирован в основном потоке. Я не могу понять, что не так.
Ниже приведен код
Спасибо
import queue
import threading
def worker(work_queue):
while True:
if work_queue.empty():
print("Task 1 Over!")
work_queue.task_done()
break
else:
_ = work_queue.get()
print(work_queue.qsize())
# do actual work
def main():
work_queue = queue.Queue()
for i in range(10):
work_queue.put("Item %d" % (i + 1))
t = threading.Thread(target=worker, args=(work_queue, ))
t.setDaemon(True)
t.start()
print("Main Thread 1")
work_queue.join()
print("Main Thread 2")
t.join()
print("Finish!")
if __name__ == "__main__":
main()
task_done
следует вызывать для каждого рабочего элемента, который удален из очереди и обрабатывается, а не когда очередь полностью пуста. (Для этого не было бы никакой причины - очередь уже знает, когда она пуста.) join()
будет блокироваться до тех пор, пока task_done
не будет вызвано столько раз, сколько было вызвано put
.
Так:
def worker(work_queue):
while True:
if work_queue.empty():
print("Task 1 Over!")
break
else:
_ = work_queue.get()
print(work_queue.qsize())
# do actual work
Обратите внимание, что для рабочего процесса странно выходить, как только он видит пустую очередь. Обычно это было бы get()
с блокировкой и выходом только тогда, когда рабочий элемент «время выхода» вышел из очереди.