py并发_队列通讯笔记
队列缓冲
不同的进程彼此之间可以利用管道实现数据的发送和接收,但是如果说现在发送的数据过多并且接收处理缓慢的时候,那么这种情况下就需要引入队列的形式来进行缓冲的操作实现。
multiprocessing.Queue是多进程编程中提供的进程队列结构,该队列采用FIFO的形式实现不同进程间的数据通讯,这样可以保证多个数据可以按序实现发送与接受处理

此时的队列一定要使用多进程模块之中提供的队列类,才可以实现不同进程之间的数据的缓冲处理,原始的队列只能够在单进程的形式下进行操作。在multiprocessing.Queue主要使用的是两个方法:“put()”、“get()”, 这两个方法里面实际上都存在有两个重要的处理参数:block(阻塞) 、timeout(超时)。
多进程模块中的Queue方法
| No. | 方法 | 类型 | 描述 |
|---|---|---|---|
| 1 | def _init_(self,maxsize=0,*,ctx) | 构造 | 开辟队列,并设置队列保存的最大长度 |
| 2 | put(self,obj,block=True,timeout=None) | 方法 | 插入数据到队列,block为队列满时的阻塞配置(默认为True),timeout为阻塞超时时间(单位为”秒”) |
| 3 | get(self,block=True,timeout=None) | 方法 | 从队列获取数据,block为队列为空时的阻塞配置(默认为True),timeout为阻塞超时时间(单位为“秒”) |
| 4 | qsize(self) | 方法 | 获取队列保存数据个数 |
| 5 | empty(self) | 方法 | 是否为空队列 |
| 6 | full(self) | 方法 | 是否为满队列 |
队列操作延迟


block=False: 描述的是采用非阻塞的形式运行,如果发现队列中的数据已经满了,或者队列中还没有任何数据的时候,那么就会直接抛出异常。
block=True: 采用阻塞的形式进行运行,如果发现队列中的数据满了或者队列中的数据为空,那么这个时候就会让生产者或者是消费者进行等待,等待到timeout的时间到达,如果时间到达了则抛出异常。
测试
1 | |
[生产者进程]生产数据,item=0
【消费者进程】消费数据:item = 0
[生产者进程]生产数据,item=1
【消费者进程】消费数据:item = 1
[生产者进程]生产数据,item=2
【消费者进程】消费数据:item = 2
[生产者进程]生产数据,item=3
【消费者进程】消费数据:item = 3
[生产者进程]生产数据,item=4
【消费者进程】消费数据:item = 4
[生产者进程]生产数据,item=5
【消费者进程】消费数据:item = 5
[生产者进程]生产数据,item=6
【消费者进程】消费数据:item = 6
[生产者进程]生产数据,item=7
【消费者进程】消费数据:item = 7
[生产者进程]生产数据,item=8
【消费者进程】消费数据:item = 8
[生产者进程]生产数据,item=9
【消费者进程】消费数据:item = 9
进程已结束,退出代码0