附上一個例子:python
#coding:utf-8 import Queue import threading import time import random q = Queue.Queue(0) #當有多個線程共享一個東西的時候就能夠用它了 NUM_WORKERS = 3 class MyThread(threading.Thread): def __init__(self,input,worktype): self._jobq = input self._work_type = worktype threading.Thread.__init__(self) def run(self): while True: if self._jobq.qsize() > 0: self._process_job(self._jobq.get(),self._work_type) else:break def _process_job(self, job, worktype): doJob(job,worktype) def doJob(job, worktype): time.sleep(random.random() * 3) print"doing",job," worktype ",worktype if __name__ == '__main__': print "begin...." for i inrange(NUM_WORKERS * 2): q.put(i) #放入到任務隊列中去 print "job qsize:",q.qsize() for x inrange(NUM_WORKERS): MyThread(q,x).start()一些須要注意的地方:
1. 阻塞模式dom
import Queue函數
q = Queue.Queue(10)spa
......
for i in range(10):
q.put('A')
time.sleep(0.5)
線程
這是一段極其簡單的代碼(另有兩個線程也在操做隊列q),我指望每隔0.5秒寫一個'A'到隊列中,但老是不能如願:間隔時間有時會遠遠超過0.5秒。原來,Queue.put()默認有 block = True 和 timeou 兩個參數。當 block = True 時,寫入是阻塞式的,阻塞時間由 timeou 肯定。當隊列q被(其餘線程)寫滿後,這段代碼就會阻塞,直至其餘線程取走數據。Queue.put()方法加上 block=False 的參數,便可解決這個隱蔽的問題。但要注意,非阻塞方式寫隊列,當隊列滿時會拋出 exception Queue.Full 的異常。code
2. 沒法捕獲 exception Queue.Empty 的異常對象
while True:
......
try:
data = q.get()
except Queue.Empty:
break隊列
個人本意是用隊列爲空時,退出循環,但實際運行起來,卻陷入了死循環。這個問題和上面有點相似:Queue.get()默認的也是阻塞方式讀取數據,隊列爲空時,不會拋出 except Queue.Empty ,而是進入阻塞直至超時。 加上block=False 的參數,問題迎刃而解。utf-8