一、queue
在多线程编程中,程序的解耦往往是一个麻烦的问题,以及在socket网络编程中也会有这样的问题。recv 和send之间,如果服务端有消息,问题需要发送给客户端,而那边的recv 被主程序占用,而使用多线程加 队列queue,我们就可以把消息发送到queue,而不用管对方怎么处理是否处理,同样对于服务端。
- 消息队列queue在多线程编程中是一个非常好用的模块。
1.1 几种不同的queue
先进先出:q1 = queue.Queue(maxsize= 0) # first in first out
先进后出: q2 = queue.FifoQueue(maxsize= 0) # last in first out
优先级队列: q3 = queue.PriorityQueue(maxsize= 0) #放入元组数据,第一个参数越小优先级越高
- 队列的几种常用方法
-
q.put(item, block= True, timeout= 0) #第一个参数为数据,第二个为是否阻塞,如队列满了,就阻塞住程序,不让放进去, 第三超时时间
-
q.get(block= True, timeout= 0) #同理put, 队列为空阻塞,如果block为False就不阻塞。
-
q.qsize() 查看当前队列长度,如当q.qsize()>0 时,你就去q.get()
-
q.empty() 如果当前队列为空则返回True,也可用来检查队列中是否有任务等场景
-
q.full() 同上队列满了返回True
>>> import queue
>>> q= queue.Queue(10)
>>> q.put(1)
>>> q.put(2)
>>> q.qsize()
2
>>> q.empty()
False
>>> q.full()
False
>>> q.get(block=False)
1
>>> q.get(block=False)
2
>>> q.get(block=False)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "E:python35libqueue.py", line 161, in get
raise Empty
queue.Empty