python - 常用模块 - queue

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python - 常用模块 - queue相关的知识,希望对你有一定的参考价值。

Python中,队列是线程间最常用的交换数据的形式。queue模块是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。

1、queue简单说明

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 
 4 ‘‘‘
 5  queue队列:常用在多线程里面,能够直接在线程安全的在多个线程之间进行数据交换,不需要当参数传递
 6  
 7  class queue.Queue(maxsize=0)  #先进先出
 8  class queue.LifoQueue(maxsize=0)  #后进先出 last in first out
 9  class queue.PriorityQueue(maxsize=0)  #存储数据时可以设置优先级的队列
10  
11  队列中可以存放任意类型数据
12  
13  队列常用方法:
14     put(x)  将x存储到队列,存不下就就会阻塞,timeout设置阻塞超时时间,不设置会一直阻塞
15     put_nowait(x)  不阻塞,放不进去就报错
16     get()  从队列中取出一个值(先进先出),其余的跟put一样
17     get_nowait()  从队列中取出一个值,队列没有值时直接报错
18     full()  判断队列是否满了
19     empty()  判断队列是否为空
20     qsize()  返回队列实际的长度(存了多少个值)
21     
22 ‘‘‘
23 
24 import queue
25 
26 class Human(object):
27     def __init__(self,n):
28         self.n = n
29 
30 print(\033[31;1m 先进先出队列Queue \033[0m)
31 q = queue.Queue(maxsize=3)   #队列中最多存储几个值,可以不加maxsize
32 # q.get() #get是阻塞函数,当队列里面没有数据时,就会一直等待
33 # q.get(timeout=3)   # 阻塞3秒,没有数据就报错
34 # q.get_nowait()  #不阻塞,没有数据就直接报错 queue.Empty Error
35 q.put([1,2,a,[5,6]])  #这里传入的列表在队列中只是一个数据
36 q.put(1)
37 
38 h = Human(2)
39 q.put(h)
40 print(q.full())   # full 判断队列是否存满了  empty 判断队列是否为空
41 # q.put(4,timeout=2)
42 
43 print(\033[31;1m 先进后出队列LifoQueue \033[0m)
44 
45 lq = queue.LifoQueue()
46 for i in range(5):
47     lq.put(i)
48 print(LifoQueue values:,lq) #LifoQueue values: <queue.LifoQueue object at 0x0000022EA3959DA0>
49 print(取第一个值:,lq.get())
50 
51 print(\033[31;1m 设置优先级队列PriorityQueue \033[0m)
52 pq = queue.PriorityQueue()
53 pq.put((1,asb))
54 pq.put((10,223))     #优先级和数据以元组两个值的形式传递给put,因为put第二个参数默认是timeout
55 pq.put((8,[1,5]))
56 pq.put((3,(1,c)))
57 
58 print(pq.get())
59 print(pq.get())
60 print(pq.get())
61 print(pq.get())
62 ‘‘‘
63 (1, ‘asb‘)
64 (3, (1, ‘c‘))
65 (8, [1, 5])
66 (10, 223)
67 ‘‘‘

  执行结果

 先进先出队列Queue 
True
 先进后出队列LifoQueue 
LifoQueue values: <queue.LifoQueue object at 0x000001C9D6CE3CC0>
取第一个值: 4
 设置优先级队列PriorityQueue 
(1, asb)
(3, (1, c))
(8, [1, 5])
(10, 223)

 

2、queue简单使用

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 
 4 import queue
 5 import threading
 6 import time
 7 
 8 def get_value(i,q):
 9     time.sleep(2)
10     value = q.get()
11     print(线程[%s]获取的值:%s %(i,value))
12 
13 if __name__ == __main__:
14     q = queue.Queue()
15     for i in range(20):
16         q.put(i**2)
17 
18     thread_list = []
19     for i in range(20):
20         t = threading.Thread(target=get_value,args=[i,q,])
21         t.start()
22         thread_list.append(t)
23 
24     for i in thread_list:
25         i.join()
26 
27 print(\033[32;1m ----main thread end----\033[0m)

  执行结果

线程[3]获取的值:0
线程[2]获取的值:1
线程[1]获取的值:4
线程[0]获取的值:9
线程[18]获取的值:16
线程[19]获取的值:25
线程[17]获取的值:36
线程[10]获取的值:49
线程[15]获取的值:64
线程[14]获取的值:81
线程[12]获取的值:100
线程[16]获取的值:121
线程[11]获取的值:144
线程[9]获取的值:169
线程[8]获取的值:196
线程[7]获取的值:225
线程[5]获取的值:256
线程[13]获取的值:289
线程[6]获取的值:324
线程[4]获取的值:361
 ----main thread end----

 

3、基于queue的生产者消费者模型

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 
 4 import threading
 5 import queue
 6 import time
 7 
 8 def customer(n):
 9     while True:
10         # print(‘hello‘)
11         print("\033[32;1m customer [%s] \033[0m get task: %s" % (n,q.get()))
12             #消费者线程第一次执行到get时会阻塞,所以每次都是生产者在前面
13         time.sleep(1)
14         q.task_done()  #每个从队列里面取值的线程执行结束后,都会通知队列说任务结束
15 
16 def producer(n):
17     count = 1
18     while True:
19         print("producer [%s] producted a new task: %s " %(n,count))
20         q.put(count)
21         count += 1
22         q.join()  #当队列里面还有值就处于阻塞状态,没值时就会解除阻塞(阻塞状态是不占用任何资源的)
23         print(all task has benn cosumed by consumers...)
24 
25 
26 if __name__ == __main__:
27     q = queue.Queue()
28     thread_list = [] #用来存放所有的线程,目的是后面的join,让父线程等这些线程结束后再结束
29 
30     for i in range(3):
31         c = threading.Thread(target=customer,args=[i,])
32         c.start()
33         thread_list.append(c)
34 
35     for i in range(2):
36         p = threading.Thread(target=producer,args=[i,])
37         p.start()
38         thread_list.append(p)
39 
40     for thread in thread_list:
41         thread.join()
42 
43 
44     # print("\033[32;1m ----main thread end---- \033[0m")

  执行结果

producer [0] producted a new task: 1 
 customer [0]  get task: 1
producer [1] producted a new task: 1 
 customer [1]  get task: 1
all task has benn cosumed by consumers...
all task has benn cosumed by consumers...
producer [0] producted a new task: 2 
producer [1] producted a new task: 2 
 customer [2]  get task: 2
 customer [1]  get task: 2
all task has benn cosumed by consumers...
all task has benn cosumed by consumers...
producer [0] producted a new task: 3 
producer [1] producted a new task: 3 
 customer [0]  get task: 3
 customer [1]  get task: 3
all task has benn cosumed by consumers...
producer [0] producted a new task: 4 
 customer [2]  get task: 4
all task has benn cosumed by consumers...
all task has benn cosumed by consumers...
producer [0] producted a new task: 5 
producer [1] producted a new task: 4 
 customer [0]  get task: 4
 customer [1]  get task: 5

 

以上是关于python - 常用模块 - queue的主要内容,如果未能解决你的问题,请参考以下文章

Python:线程进程与协程——Queue模块及源码分析

Queue模块详解

python threading模块使用 以及python多线程操作的实践(使用Queue队列模块)

python队列

python并行任务之生产消费模式

Python之queue模块