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("33[32;1mconsumer [%s]33[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 '''
原文地址:https://www.cnblogs.com/yoyovip/p/5795287.html