python multiprocessing Pipe Queue

两者功能类似,甚至可以说是相同,都是用于多进程通信。两者可以认为是Hibernate和JPA的关系,即Queue可以看作是对Pipe的进一步封装

Pipe的基本形式为:

pipe1, pipe2 = multiprocessing.Pipe()

task1(p1, p2):
 p1.send("bingo") # 进程1向pipe1发送一条数据

task2(p1, p2):
 p2.recv() # 进程2接收pipe中的数据,如果没有数据则会阻塞

multiprocessing.Process(target=task1, args=(pipe1, pipe2)).start()
multiprocessing.Process(target=task2, args=(pipe1, pipe2)).start()

上面代码为 Pipe 的默认用法,需要注意的是:

就像非对称加密中的公钥和私钥一样,使用公钥加密的数据必须用私钥才能解密,使用私钥加密的数据必须用公钥解密

这里也一样,pipe1 和 pipe2 互为一对,任意一个用来发送数据,就必须用另一个才能接收。

另外,你可以向pipe中send多个数据,但每次调用recv时只会获取一条数据

与Pipe类似的还有 Queue,不同点在于它只是一个实例 queue = multiprocessing.Queue()

事实上,可以认为Queue是对Pipe的封装,这种封装带来了两个好处:1)全双工通信,即一个Queue对象既可以发,也可以收。2)实际上Pipe是有send 限制的,即如果一直send数据但不recv,当占用一定大小内存后,send也会发生阻塞,而Queue就不会。但是,当设置 Pipe(duplex=True) 时,得到的两个pipe就都是全双工通信的了,相当于得到了两个Queue

但也正因为如此,Queue的效率往往更低

另一个不同在于:从设计思想上,Pipe应该被用于两个进程间通信,而Queue则可以应用于多进程间通信。但从实际使用上看,即使将Pipe用于多进程间通信也是没问题的。

参考:https://superfastpython.com/multiprocessing-pipe-in-python

Leave a Comment