Python线程和队列examp

2024-04-25 22:24:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python新手(我来自PHP),我已经阅读了几天的教程并尝试了一些东西,但是我不理解这个队列示例(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()不会永远阻塞?


Tags: inorgtruehttp示例docsforget
2条回答

我也有同样的问题。当所有线程完成时,我在进程列表中看到了“休眠线程”(在脚本中使用top -H -p <pid>,其中<pid>是来自ps aux | grep python的进程id)。

我通过将“无限循环”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

在此代码中,线程通常不会退出(队列为空时,它们确实会被阻塞)。程序不会等待它们,因为它们是daemon threads

程序不会立即退出,也不会因为^{}^{}调用而永远阻塞。

每当将项目添加到队列中时,未完成任务的计数就会增加。每当使用者线程调用task_done()以指示已检索该项,并且对该项的所有工作都已完成时,计数就会下降。当未完成任务的计数降到零时,join()解除阻止,并且程序存在而不等待守护进程线程。

相关问题 更多 >