python manager_Python3.x:多进程Pipes与Manager

除了队列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

你可能感兴趣的:(python,manager)