有三种方式:
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) #主进程,打印子进程处理后的列表数据