我正在学习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()
运行时,只打印值,永不退出。
当队列为空时,如何让程序退出?
答案 0 :(得分:1)
来自Queue.join()
的文档字符串:
阻止,直到获取并处理了队列中的所有项目。
每当项目被添加到时,未完成任务的数量就会增加 队列。只要消费者线程调用task_done(),计数就会下降 表示该项目已被检索,所有相关工作均已完成。
当未完成任务的数量降至零时,join()取消阻止。
因此,您必须在处理完项目后致电tests.task_done()
。
由于您的线程是守护程序线程,并且队列将正确处理并发访问,因此您无需检查队列是否为空或使用锁定。你可以这样做:
def start_thread():
while True:
test = tests.get()
print("{}".format(test))
tests.task_done()