Queue与生产者消费者模型
queue,队列是线程间最常用的交换数据的形式,当信息必须在多个线程之间安全交换的时候,队列在线程编程是特别有用的。
1.创建一个队列
import queue
q = queue.Queue(maxsize=5) #队列最多3个,先入先出
q = queue.LifoQueue(maxsize=3) #先入后出
q = queue.PriorityQueue(maxsize=0) #存储数据时可设置优先级的队列
通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限
2.常用操作
q.put(1) #向队列中放值
q.get() #从队列中取值
q.qsize() 返回队列的大小
q.empty() 如果队列为空,返回True,反之False
q.full() 如果队列满了,返回True,反之False
q.get([block[, timeout]]) 获取队列,timeout等待时间
q.get_nowait() 相当q.get(False)
q.put_nowait(item) 相当q.put(item, False)
q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
q.join() 实际上意味着等到队列为空,再执行别的操作
生产者消费者模型
1 import threading,queue 2 import time 3 4 def consumer(n): 5 while True: 6 print("\033[32;1mconsumer [%s]\033[0m get task: %s" %(n,q.get())) 7 time.sleep(1) 8 q.task_done() #发出一个任务完成的信号 9 def producer(n): 10 count = 1 11 while True: 12 #time.sleep(1) 13 #if q.qsize() < 3: 14 print("prodcer [%s] produced a new task : %s" %(n,count)) 15 q.put(count) 16 count += 1 17 q.join() #等待队列为空 18 print("all taks has been cosumed by consumers...") 19 20 q = queue.Queue() 21 c1 = threading.Thread(target=consumer,args=[1,]) 22 c2 = threading.Thread(target=consumer,args=[2,]) 23 c3 = threading.Thread(target=consumer,args=[3,]) 24 p = threading.Thread(target=producer,args=["nima",]) 25 p2 = threading.Thread(target=producer,args=["nimei",]) 26 c1.start() 27 c2.start() 28 c3.start() 29 p.start() 30 p2.start()
31 ''' 32 输出结果 33 prodcer [xiaoyu] produced a new task : 1 34 consumer [1] get task: 1 35 prodcer [yaoguo] produced a new task : 1 36 consumer [2] get task: 1 37 all taks has been cosumed by consumers... 38 all taks has been cosumed by consumers... 39 prodcer [xiaoyu] produced a new task : 2 40 prodcer [yaoguo] produced a new task : 2 41 consumer [3] get task: 2 42 consumer [2] get task: 2 43 '''