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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# coding: UTF-8
import multiprocessing,time
def put_worker(queue): # 队列生产者
for item in range(10): # 生产10次数据
time.sleep(1)
print("[%s]生产数据,item=%s" %
(multiprocessing.current_process().name, item))
queue.put("item = %s" % item)
def get_worker(queue):
while True: #持续消费
try:
print("【%s】消费数据:%s" %
(multiprocessing.current_process().name,queue.get(block=True,timeout=2)))
except:
break
def main():
queue = multiprocessing.Queue() # 创建进程延迟队列
producer_process = multiprocessing.Process(target=put_worker, name="生产者进程", args=(queue,))
consumer_process = multiprocessing.Process(target=get_worker, name="消费者进程", args=(queue,))
producer_process.start() #进程启动
consumer_process.start() #进程启动
producer_process.join() # 生产者强制执行完毕,阻塞主进程
consumer_process.join() # 消费者强制执行完毕
if __name__ == "__main__":
main()

[生产者进程]生产数据,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

笔记来源


py并发_队列通讯笔记
https://blog.wangxk.cc/2020/01/30/py并发-队列通讯笔记/
作者
Mike
发布于
2020年1月30日
许可协议