我有一个程序,它有两个线程,一个主线程,另一个用来处理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()方法的线程清除主线程出口上的队列?
发布于 2015-11-29 01:42:04
注释涉及到使用.join(),但是根据您的用例,使用连接可能会使线程没有意义。
我假设您的主线程将执行除向队列中添加项之外的其他事情--并且可能在任何时候被关闭,您只想确保队列在关闭完成之前是空的。
在主线程的末尾,可以在循环中添加一个简单的空检查。
while not q.empty():
sleep(1)如果不设置t.daemon = True,那么线程就永远不会完成。将线程设置为守护进程线程意味着,当主线程完成时,线程不会导致您的程序保持运行。
发布于 2018-03-21 21:01:50
在队列中放置一个特殊的项(例如,无),以指示工作线程停止。
import queue
import threading
q = queue.Queue()
def _worker():
while True:
msg = q.get(block=True)
if msg is None:
return
print(msg) # do your stuff here
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')
q.put(None)
t.join()https://stackoverflow.com/questions/33977121
复制相似问题