多进程之间数据通讯

有三种方式:

1 进程对列Queue

from multiprocessing import Process, Queue
import queue

def f(q,n):
    q.put(n*n+1)
    print("son process",id(q))

if __name__ == '__main__':
    q = Queue()        #通过Queue对象来进行通信
    print("main process",id(q))

    for i in range(3):
        p = Process(target=f, args=(q,i))   #子进程 需要把这个q传递给函数操作
        p.start()

    print(q.get())    #主进程就能获取到子进程操作的数据
    print(q.get())
    print(q.get())

2 管道

from multiprocessing import Process, Pipe

def f(conn):
conn.send([12, {"name":"123"}, 'hello']) #发送消息给主进程
response=conn.recv() #接收主进程发过来的消息
print("接收主进程消息1:",response)
print("接收主进程消息2:",conn.recv())
conn.close()


if __name__ == '__main__':
parent_conn, child_conn = Pipe() #主进程创建一个管道对象,这管道对象,会拿到2个对象
p = Process(target=f, args=(child_conn,)) #child_conn 把主进程的通信管道传递给子进程
p.start()

print(parent_conn.recv()) # "[12, {"name":"123"}, 'hello']" 如果子进程不发消息过来,这里会阻塞状态,等子进程传递消息
parent_conn.send("主进程发子进程的消息1") #发送给子进程
parent_conn.send("主进程发子进程的消息2")
p.join()

结果是:

  [12, {'name': '123'}, 'hello']
  接收主进程消息1 主进程发子进程的消息1
  接收主进程消息2 主进程发子进程的消息2

 

3 Queue和pipe(管道)只是实现了数据交互,并没实现数据共享,即一个进程去更改另一个进程的数据。

Managers
from multiprocessing import Process, Manager
def f(d, l,n):
d[n] = '1'
d['2'] = 2
l.append(n)

if __name__ == '__main__':
with Manager() as manager: #就相当不用关闭了连接
d = manager.dict() #需要通过manager创建一个字典
l = manager.list(range(5)) #需要通过manager创建一个列表
p_list = []

for i in range(10):
p = Process(target=f, args=(d,l,i)) #子进程传递字典 列表
p.start()
p_list.append(p)

for res in p_list:
res.join()

print(d) #主进程,打印子进程处理后的字典数据
print(l) #主进程,打印子进程处理后的列表数据


猜你喜欢

转载自www.cnblogs.com/ajaxa/p/9145641.html
今日推荐