首页 文章

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

提问于
浏览
0

我有一堆 Worker 使用以下代码:

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

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

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

1 回答

  • 0

    正如您所猜测的那样,您的工作人员是否已经退出,将 None 或其他标记发布到输入队列中 . 这是一个有一个 Worker 的小例子:

    简单工作线程退出无

    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
    

相关问题