首页 文章

Python线程和队列示例

提问于
浏览
15

我'm new to python (I come from PHP), I'已经阅读了教程并尝试了几天,但我无法理解这个队列示例(http://docs.python.org/2/library/queue.html

def worker():
    while True:
        item = q.get()
        do_work(item)
        q.task_done()

q = Queue()
for i in range(num_worker_threads):
     t = Thread(target=worker)
     t.daemon = True
     t.start()

for item in source():
    q.put(item)

q.join()       # block until all tasks are done

我不明白的是工作线程是如何完成和存在的 . 我已经读过q.get()块,直到一个项可用,所以如果所有项都被处理并且没有留在队列中,为什么q.get()不会永远阻塞?

2 回答

  • -3

    线程在此代码中不会正常退出(当队列为空时它们确实被阻止) . 该计划没有't wait for them because they'重新daemon threads .

    由于q.joinq.task_done调用,该程序不会永久阻止 .

    每当项目添加到队列时,未完成任务的计数就会增加 . 只要消费者线程调用 task_done() 指示该项目已被检索并且其上的所有工作都已完成,计数就会下降 . 当未完成任务的数量降至零时, join() 解除阻塞,并且程序存在而不等待守护程序线程 .

  • 9

    我曾经也有过一样的问题 . 当所有线程都完成后,我在进程列表中看到了"sleeping threads"(使用 top -H -p <pid> ,其中 <pid> 是来自 ps aux | grep python 的进程ID和您的脚本) .

    我通过将"infinite loop" while True 替换为 while not q.empty(): 解决了这个问题 .

    它解决了“睡眠线程”的问题 .

    def worker():
        while not q.empty():
            item = q.get()
            do_work(item)
            q.task_done()
    
    q = Queue()
    for i in range(num_worker_threads):
         t = Thread(target=worker)
         t.daemon = True
         t.start()
    
    for item in source():
        q.put(item)
    
    q.join()       # block until all tasks are done
    

相关问题