完成所有任务后如何处理工作线程无限期地等待队列获取?

时间:2016-04-26 14:40:26

标签: python multithreading queue python-multithreading

我有一群工人使用以下代码:

while True:
            inp = q.get()
<do stuff>
            q.task_done()

然后在主线程中加入队列,工作人员仍在等待。

在这种情况下,如何让工人优雅地关闭?我知道的唯一方法是将一堆Nones推入队列并检查它们,但是这个解决方案看起来非常h​​ackish。我必须在程序终止之前执行此操作,因此守护程序线程不是一个选项。此外,仅仅检查空队列是不够的,因为工作人员可以动态添加任务。

1 个答案:

答案 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