除了队列queue,还有别的方法能实现进程间通信么?这里就说一下Pipes,在两个进程之间建立一个管道,利用管道来通信
这里的管道就相当于建立了一个scoket连接,利用这个链接在进程间传输数据
from multiprocessing import Process
from multiprocessing import Pipe
# 定义了一个foo函数
def foo(conn):
# 发送数据
conn.send('hello')
conn.close()
if __name__ == '__main__':
# 生成pipe对象返回两个值对应管道的两头收发数据
f_conn, s_conn = Pipe()
# 将管道的另一头传给子进程
p = Process(target=foo, args=(s_conn, ))
p.start()
# 接收数据
print(f_conn.recv())
p.join()
当然主进程也可以给子进程发消息,然后子进程收消息
说了这么多要么是操作复制的数据,要么利用管道传输数据,如何能能真正的操作同一份数据呢,这里就用到了Manager,先看看如何使用Manager
from multiprocessing import Process
from multiprocessing import Manager
import os
# 定义了一个foo函数,接收一个字典和一个列表
def foo(d, l):
# 字典和列表都放进程ID
d[os.getpid()] = os.getpid()
l.append(os.getpid())
if __name__ == '__main__':
# 生成Manager对象
manager = Manager()
d = manager.dict()
l = manager.list(range(3))
# 10个进程分别join
p_list = []
for i in range(10):
p = Process(target=foo, args=(d, l))
p.start()
p_list.append(p)
for res in p_list:
res.join()
# 打印字典和列表
print(d)
print(l)

这样就实现了操作同一份数据,虽然实现了这个效果,但是依然遵循进程间数据不共享的原则,只是通过数据的克隆和合并来实现这种效果
并且,这里不需要像进程一样加锁防止同时修改数据出错,Manager自带锁来防止这些情况
转载请注明出处
python自学技术互助扣扣群:670402334
网友评论