队列,用于多线程之间安全的交换数据,queue.Queue模块实现了全部必须的锁定义。安全
FIFO:First Input First Output 先进先出多线程
LIFO:Last Input First Output 后进先出app
一、Queue (FIFO) 代码示例:ide
1 import queue 2 import threading 3 import time 4 5 q = queue.Queue() 6 threads = [] 7 queue_num = 5 8 9 def worker(): 10 while True: 11 data = q.get() 12 if data is None: 13 break 14 print('Get:', data) 15 q.task_done() # 在get后调用,表示以前队列的任务执行完成 16 time.sleep(1) 17 18 for thread in range(2): 19 t = threading.Thread(target=worker) 20 t.start() 21 threads.append(t) 22 23 for n in range(queue_num): 24 q.put('Item_%s' % n) 25 print('Put:', 'Item_%s' % n) 26 27 q.join() # 阻塞,直到队列中的全部项都被获取并处理 28 29 for i in range(queue_num): 30 q.put(None) 31 32 for t in threads: 33 t.join()
# 所有按顺序获取 Put: Item_0 Get: Item_0 Put: Item_1 Get: Item_1 Put: Item_2 Put: Item_3 Put: Item_4 Get: Item_2 Get: Item_3 Get: Item_4
二、LifoQueue (LIFO) 代码示例:spa
1 # 和Queue同样,只是在实例化时,将queue.Queue改成queue.LifoQueue 2 3 import queue 4 import threading 5 import time 6 7 q = queue.LifoQueue(maxsize=3) # 后进先出队列,队列上限为3 8 threads = [] 9 queue_num = 5 10 11 def worker(): 12 while True: 13 data = q.get() 14 if data is None: 15 break 16 print('Get:', data) 17 q.task_done() 18 time.sleep(1) 19 20 for thread in range(2): 21 t = threading.Thread(target=worker) 22 t.start() 23 threads.append(t) 24 25 for n in range(queue_num): 26 q.put('Item_%s' % n) 27 print('Put:', 'Item_%s' % n) 28 29 q.join() 30 31 for i in range(queue_num): 32 q.put(None) 33 34 for t in threads: 35 t.join()
Put: Item_0 Get: Item_0 Put: Item_1 Get: Item_1 Put: Item_2 Put: Item_3 Put: Item_4 Get: Item_4 # 后进先出 Get: Item_3 Get: Item_2
三、PriorityQueue : 优先级,put的数据为一个元组:(优先级, 数据),数字越低优先级越高,越先被get方法获取,代码示例:线程
1 import queue 2 import threading 3 import time 4 5 q = queue.PriorityQueue() 6 threads = [] 7 queue_num = 5 8 9 def worker(): 10 while True: 11 data = q.get() 12 if data[1] is None: 13 break 14 print('Get:', data) 15 q.task_done() 16 time.sleep(1) 17 18 for thread in range(2): 19 t = threading.Thread(target=worker) 20 t.start() 21 threads.append(t) 22 23 for n in range(queue_num): 24 q.put((n, 'Item_%s' % n)) 25 print('Put:', 'Item_%s' % n) 26 27 q.join() 28 29 for i in range(queue_num): 30 q.put((0, None)) 31 32 for t in threads: 33 t.join()
Put: Item_0 Get: (0, 'Item_0') Put: Item_1 Get: (1, 'Item_1') Put: Item_2 Put: Item_3 Put: Item_4 Get: (2, 'Item_2') # 数字越小,越先被get获取 Get: (3, 'Item_3') Get: (4, 'Item_4')