我有一个程序有两个线程,主线程和一个附加的处理来自FIFO队列的作业.
像这样的东西:
import queue
import threading
q = queue.Queue()
def _worker():
while True:
msg = q.get(block=True)
print(msg)
q.task_done()
t = threading.Thread(target=_worker)
#t.daemon = True
t.start()
q.put('asdf-1')
q.put('asdf-2')
q.put('asdf-4')
q.put('asdf-4')
我想要完成的基本上是确保在主线程退出之前清空队列.
如果我将t.daemon设置为True,程序将在队列清空之前退出,但是如果它被设置为False,程序将永远不会退出.有没有办法确保运行_worker()方法的线程清除主线程退出的队列?
最佳答案 评论涉及使用.join(),但根据您的使用案例,使用连接可能会使线程毫无意义.
我假设您的主线程将执行除将项添加到队列之外的其他操作 – 并且可能随时关闭,您只需要确保在关闭完成之前您的队列为空.
在主线程结束时,您可以在循环中添加一个简单的空检查.
while not q.empty():
sleep(1)
如果你没有设置t.daemon = True,那么线程永远不会完成.将线程设置为守护程序线程意味着线程不会导致程序在主线程完成时保持运行.