如果没有指定task_done(),队列如何知道线程?

时间:2017-10-14 11:48:27

标签: python multithreading queue

我正在做一些线程过期,并注意到即使没有q.task_done()语句,我的代码仍可以工作。

import Queue, threading

queue = Queue.Queue()

def get_url(url):
    queue.put({url: len(urllib2.urlopen(url).read())})

def read_from_queue():
    m = queue.get()
    print m.items()
    queue.task_done()  # <-- this can be removed and still works

def use_threads():
     threads = []
     for u in urls:
         t = threading.Thread(target=get_url, args=(u,))
         threads.append(t)
         t.start()

     for t in threads:
         t.join()

     threads = []
     for r in urls:
         t = threading.Thread(target=read_from_queue)
         threads.append(t)
         t.start()

     for t in threads:
         t.join()

这是一个简单的程序,它循环遍历url列表,读取它们的内容并将其总结为len个字节。然后它会在队列中放入一个包含url名称及其大小的dict。

timeit.timeit测试了两个案例;结果是混合的,但这是有道理的,因为大部分工作都发生在网络上。

队列如何知道任务已完成?如何在队列中调用没有t.join()的{​​{1}}返回?

2 个答案:

答案 0 :(得分:3)

queue.task_done仅影响queue.join

queue.task_done不会影响thread.join

您正在拨打thread.join并且从不致电queue.join,因此queue.task_done并不重要

答案 1 :(得分:0)

Zang MingJie 做对了。我是join()线程,而不是队列本身。 线程完成后,join()返回。

那是我失踪的那篇:

当线程是守护进程时,task_done()的整个想法是,或者直到被杀死才会返回。然后你不能join()线程,因为它会死锁。

所以,当你有这样的场景时 - 你join()队列。当队列没有任务时(表示当前没有工作),这将返回。