线程没有退出

时间:2018-04-27 16:40:23

标签: python multithreading

我正在学习Python中的Thread,我正在尝试创建一个简单的程序,一个使用线程从队列中获取数字并打印它的程序。

我有以下代码

import threading
from Queue import Queue

test_lock = threading.Lock()

tests = Queue()

def start_thread():
    while not tests.empty():
        with test_lock:
            if tests.empty():
                return
            test = tests.get()
        print("{}".format(test))

for i in range(10):
    tests.put(i)
threads = []
for i in range(5):
    threads.append(threading.Thread(target=start_thread))
    threads[i].daemon = True
for thread in threads:
    thread.start()
tests.join()

运行时,只打印值,永不退出。

当队列为空时,如何让程序退出?

1 个答案:

答案 0 :(得分:1)

来自Queue.join()的文档字符串:

  

阻止,直到获取并处理了队列中的所有项目。

     

每当项目被添加到时,未完成任务的数量就会增加   队列。只要消费者线程调用task_done(),计数就会下降   表示该项目已被检索,所有相关工作均已完成。

     

当未完成任务的数量降至零时,join()取消阻止。

因此,您必须在处理完项目后致电tests.task_done()

由于您的线程是守护程序线程,并且队列将正确处理并发访问,因此您无需检查队列是否为空或使用锁定。你可以这样做:

def start_thread():
    while True:
        test = tests.get()
        print("{}".format(test))
        tests.task_done()