管道,进程间数据共享,进程池

一:管道

使用: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

猜你喜欢

转载自my.oschina.net/u/3657436/blog/1786448