前面了解了一下threading,发现通常都是和queue模块配合使用的,queue产生一个队列,队列模式有3种,针对这三种队列分别有三个构造函数:python
1 FIFO队列先进先出:class Queue.Queue(maxsize)函数
2 LIFO相似于堆,即先进后出:class Queue.LifoQueue(maxsize) 测试
3 优先级队列级别越低越先出来:class Queue.PriorityQueue(maxsize)spa
队列长度可为无限或者有限。可经过Queue的构造函数的可选参数maxsize来设定队列长度。若是maxsize小于1就表示队列长度无限。调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数, 默认为1。若是队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。若是block为0,put方法将引起Full异常。调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为1。若是队列为空且block为1,get()就使调用线程暂停,直至有项目可用。若是block为0,队列将引起Empty异常。join()保持阻塞状态,直处处理了队列中的全部项目为止。在将一个项目添加到该队列时,未完成的任务的总数就会增长。当使用者线程调用task_done()以表示检索了该项目、并完成了全部的工做时,那么未完成的任务的总数就会减小。当未完成的任务的总数减小到零时,join() 就会结束阻塞状态。
.net
队列实例分别有如下操做方法: 线程
Queue.qsize() 返回队列的大小
Queue.empty() 若是队列为空,返回True,反之False
Queue.full() 若是队列满了,返回True,反之False
Queue.full 与 maxsize 大小对应
Queue.get([block[, timeout]]) 获取队列,timeout等待时间
Queue.get_nowait() 至关Queue.get(False)
Queue.put(item) 写入队列,timeout等待时间
Queue.put_nowait(item) 至关Queue.put(item, False)
Queue.task_done() 在完成一项工做以后,Queue.task_done() 函数向任务已经完成的队列发送一个信号
Queue.join() 实际上意味着等到队列为空,再执行别的操做
code
下面是一个生产者消费者模型,抄的改改代码就能够用了,主要是了解过程。 对象
#!/usr/bin/python
import Queue
import time import threading q=Queue.Queue() class producer(threading.Thread): def __init__(self,i): threading.Thread.__init__(self,name="producer Thread-%d" % i) def run(self): global q count=9 while True: for i in range(3): if q.qsize() > 12: pass else: count=count+1 msg=str(count) q.put(msg) print self.name+' '+'producer'+msg+' '+'Queue Size:'+str(q.qsize()) time.sleep(2) class consumer(threading.Thread): def __init__(self,i): threading.Thread.__init__(self,name="consumer Thread-%d" % i) def run(self): global q while True: for i in range(3): if q.qsize() < 1: pass else: msg=q.get() print self.name+' '+'consumer'+msg+' '+'Queue Size:'+str(q.qsize()) time.sleep(2) def test(): for i in range(10): q.put(str(i)) print 'Init producer '+str(i) for i in range(2): p=producer(i) p.start() for i in range(3): c=consumer(i) c.start() if __name__ == '__main__': test()
测试图以下:队列