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

一:管道spa

使用:from multiprocessing import Process,Pipe对象

知识:进程

1 建立管道时候:Pipe()默认是双工的,如改为False,那么conn1只能接收,conn2只能发送。ip

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,操做将无限期地等待数据到达。

进程之间一个接收信息,一个发送消息get

# 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()

打印结果:一个helloimport

若是是进程之间接收多条消息的时候,不是一条,须要传递多个对象(形参是两个),执行一个时候,另外一个关闭。file

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垃圾回收

相关文章
相关标签/搜索