queue

队列,用于多线程之间安全的交换数据,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
FIFO 输出结果

二、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
LIFO 输出结果

 三、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')
PriorityQueue 输出结果
相关文章
相关标签/搜索