Python--Queue
线程队列:
先入先出队列、后进先出队列、优先级队列
先入先出:
1 import queue # 导入模块 2 3 q = queue.Queue() # 实例化一个队列 4 q.put(1) # 向队列中插入数据 5 q.put(2) 6 q.put(3) 7 8 while True: # 循环取数据 9 if q.qsize() != 0: # 当队列大小不为0时则代表队列中有数据 10 print(q.get()) # 获取数据并打印 11 else: 12 break # 当无数据时退出循环
后进先出:
1 import queue # 导入模块 2 3 # 后进先出 4 q = queue.LifoQueue() # last in first out 5 q.put(1) 6 q.put(2) 7 q.put(3) 8 9 print(q.get()) # 直接取数据,当取不到数据时,程序会阻塞 10 print(q.get_nowait()) # # 直接取数据,当取不到数据时,程序会报错:_queue.Empty 11 print(q.get()) 12 print(q.get_nowait())
优先级队列:
1 import queue 2 3 # 根据消息优先级取数据 4 q = queue.PriorityQueue() # 实例化优先级队列 5 q.put((1,'a')) # 向队列中加数据,并设置优先级 6 q.put((-1,'b')) 7 q.put((10,'c')) 8 q.put((3,'z')) 9 10 print(q.get_nowait()) 11 print(q.get_nowait()) 12 print(q.get_nowait()) 13 print(q.get_nowait()) 14 15 # ----------------------------- 16 (-1, 'b') 17 (1, 'a') 18 (3, 'z') 19 (10, 'c')
设置队列空间大小
1 import queue 2 import time 3 # 设置队列大小 4 q = queue.Queue(maxsize=8) # 设置队列最大值为8,队列中最多同时存在8条数据 5 6 for i in range(10): 7 if i < q.maxsize: 8 q.put(i) 9 10 while q.qsize() != 0: 11 print(q.get()) 12 time.sleep(0.5) 13 14 #----------------------------- 15 0 16 1 17 2 18 3 19 4 20 5 21 6 22 7
生产者消费者模型示例:
1 import threading,time,queue 2 3 q = queue.Queue(maxsize=10) # 实例化一个先入先出的队列,并设置队列大小为10 4 5 6 def Producter(name): 7 count = 1 8 while count <= 20: 9 q.put("骨头%s" % count) 10 print("%s生产出骨头--%s" % (name,count)) 11 count += 1 12 13 def Consumer(name): 14 while True: 15 if q.qsize() != 0: 16 print("[%s] 取到了骨头[%s]并把它吃了" %(name,q.get())) 17 time.sleep(1) 18 else: 19 print("%s:今天的骨头吃完了,嘤嘤嘤!!!"%name) 20 break 21 22 yy = threading.Thread(target=Producter,args=('yy',)) #实例化一个生产者线程 23 tj = threading.Thread(target=Consumer,args=('tj',)) #实例化一个消费者线程 24 xl = threading.Thread(target=Consumer,args=('xl',)) #实例化另一个消费者线程 25 yy.start() # 启动生产者线程 26 tj.start() # 启动消费者线程1 27 xl.start() # 启动消费者线程2