我正在做一些线程过期,并注意到即使没有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}}返回?
答案 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()
队列。当队列没有任务时(表示当前没有工作),这将返回。