在前几天的《python多进程与进程间通信:fork()方法和multiprocess实例》中,简明扼要地记录了些Python多进程的用法。
本文主要深入讲下pipe。主要是记录实践中遇到的问题:如何在多进程之间通过pipe()传输或共享一个实例对象;使用pipe()后为什么另一个进程会出来停滞现象而非并行执行;如何忽略其中一个进程的延迟,执行异步的并行计算。
pipe即一个管道,所创建管道返回两个连接对象,代表管道的两端,用于进程或者线程之间的通信。multiprocessing.Pipe()则可以双向通信,和队列Queue的单向通信不同。
我们看一个例子:
import multiprocessing
import os
def func(conn): #conn管道类型
conn.send(["a","b","c","d","e"]) #发送的数据
print("子进程",os.getpid(),conn.recv()) #收到的数据
conn.close() #关闭
if __name__=="__main__":
conn_a,conn_b=multiprocessing.Pipe() #创建一个管道,两个口
#print(id(conn_a),id(conn_b))
#print(type(conn_a), type(conn_b)) #multiprocessing.connection.PipeConnection类型
p=multiprocessing.Process(target=func,args=(conn_a,))
p.start()
conn_b.send([1,2,3,4,5])
print("主进程:",os.getpid(),conn_b.recv())
p.join()
p.terminate()