一:管道
使用:from multiprocessing import Process,Pipe
知识:
1 创建管道时候:Pipe()默认是双工的,如改成False,那么conn1只能接收,conn2只能发送。
conn1,conn2=Pipe()
2 Pipe模块发送字符串不用bytes类型,直接是字符串类型。
Pipe([duplex]):在进程之间创建一条管道,并返回元组(conn1,conn2),其中conn1, conn2表示管道两端的连接对象,强调一点:必须在产生Process对象之前产生管道. #参数介绍: dumplex:默认管道是全双工的,如果将duplex设置成False,conn1只能用于接收,conn2只能用于发送。 #主要方法: conn1.recv():接收conn2.send(obj)发送的对象。如果没有消息可接收,recv方法会一直阻塞。 如果连接的另外一端已经关闭,那么recv方法会抛出EOFError。 conn1.send(obj):通过连接发送对象。obj是与序列化兼容的任意对象 #其他方法: conn1.close():关闭连接。如果conn1被垃圾回收,将自动调用此方法 conn1.fileno():返回连接使用的整数文件描述符 conn1.poll([timeout]):如果连接上的数据可用,返回True。timeout指定等待的最长时限。 如果省略此参数,方法将立即返回结果。如果将timeout射成None,操作将无限期地等待数据到达。
进程之间一个接收信息,一个发送消息
# from multiprocessing import Process,Pipe # def func(conn): # conn.send('hello') # conn.close() # if __name__=='__main__':#判断是否是当前文件的文件名,如果是执行下面 # conn1,conn2=Pipe() # p=Process(target=func,args=(conn1,)) # p.start() # print(conn2.recv()) # # conn2.close() 注意 这个不写,我是写的错误的,这行去掉 # p.join()
打印结果:一个hello
如果是进程之间接收多条消息的时候,不是一条,需要传递多个对象(形参是两个),执行一个时候,另一个关闭。
from multiprocessing import Process,Pipe def func(conn1,conn2): conn2.close() while True: try: msg=conn1.recv() print(msg) except EOFError: conn1.close() break if __name__=='__main__': conn1,conn2=Pipe() Process(target=func,args=(conn1,conn2)).start() conn1.close() for i in range(20): conn2.send('hello') conn2.close()
打印结果:20个hello