附上一个例子: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