我正在做一些線程過期,並注意到我的代碼工作即使沒有q.task_done()語句。隊列如何知道一個線程沒有指定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名稱和大小的字典。
我有timeit.timeit
測試了兩種情況;結果是混合的,但這是有道理的,因爲大部分工作發生在網絡上。
如何隊列知道一個任務完成? t.join()
如何在隊列上調用時不返回task_done()
?
我剛剛在文檔上閱讀它,更新了我的答案。做一些測試,你可能是正確的,我'加入'線程而不是隊列。 – Vinny