我有一群工人使用以下代码:
while True:
inp = q.get()
<do stuff>
q.task_done()
然后在主线程中加入队列,工作人员仍在等待。
在这种情况下,如何让工人优雅地关闭?我知道的唯一方法是将一堆Nones推入队列并检查它们,但是这个解决方案看起来非常hackish。我必须在程序终止之前执行此操作,因此守护程序线程不是一个选项。此外,仅仅检查空队列是不够的,因为工作人员可以动态添加任务。
答案 0 :(得分:0)
正如您所猜测的那样,让工作人员退出,将None
或其他标记发布到输入队列中。这是一个有一个工人的小例子:
import threading, Queue
def howdy(q):
for msg in iter(q.get, None):
print 'howdy,',msg
inq = Queue.Queue()
for word in 'whiskey syrup bitters'.split():
inq.put(word)
inq.put( None ) # tell worker to exit
thread = threading.Thread(target=howdy, args=[inq])
thread.start()
thread.join()
howdy, whiskey
howdy, syrup
howdy, bitters