python 管道,进程间的数据共享

一. 管道

  管道传输数据是不安全的,队列是安全的

  导入管道 : from multiprocessing import Pipe

   创建管道 : Pipe( duplex) 在进程之间创建一条管道,并返回元组( conn1,conn2),其中conn1,conn2表示管道两端的连接对象. 管道的创建必须在Process对象之前. ( duplex : 默认管道是全双工的,如果将duplex设成False,conn1只能用于接收,conn2只能用于发送)

  接收方法 : conn1.recv() : 接收conn2.send(obj)发送的对象. 如果没有消息可接收,recv方法会一直阻塞. 如果连接的另外一段已经关闭,recv方法会抛出异常 : EOFError.

  EOFError异常 : 管道中著名的异常,就是,父进程关闭了发送端,子进程还在等待继续接收数据.

  conn1.send(obj) : 通过连接发送对象. obj是与序列化兼容的任意对象.

from multiprocessing import Process,Pipe

def func(con):
    c1,c2 = con
    c1.close()#主进程用conn1发送数据,子进程要用对应的conn2接受,所以讲conn1关闭,不关闭程序会阻塞
    while 1:
        try:#异常处理,出现异常退出
            print(c2.recv())#将conn2接受的数据打印
        except:#说明素有数据已经全部接受,进程会抛出异常
            break

if __name__ == '__main__':
    conn1,conn2 = Pipe()#开启管道
    p = Process(target=func, args=((conn1,conn2),))#将管道的两个返回值以元组形式传给子进程
    p.start()
    conn2.close()#用conn1发送数据,conn2不用,将其关闭
    for i in range(10):
        conn1.send(i)
    conn1.close()#发送完数据后,将conn1关闭

  如果单进程使用管道 : conn1发数据,conn2接受数据. conn2发数据,conn1接受数据.

  如果多进程使用管道 : 父进程conn1发数据,子进程conn2接收数据.

            父进程conn2发数据,子进程conn1接收数据.

            父进程conn1接收数据,子进程conn2发数据.

            父进程conn2接收数据,子进程conn1发数据.

  

二. 数据共享

  进程间的数据是独立的,可以借助队列或者管道实现通信,二者都是基于消息传递的

  虽然进程间的数据独立,但可以通过Manager实现数据共享,事实上Mansger的功能还有很多.

from multiprocessing import Manager,Process

def main(num):
    num['w'] -= 1
    print(num)#结果: 9

if __name__ == '__main__':
    m = Manager()
    num = m.dict({'w':10})#
    p = Process(target=main, args=(num,))
    p.start()
    p.join()
    print(num)#结果: 9

 

  

posted @ 2018-08-22 22:32  唯你如我心  阅读(1515)  评论(0编辑  收藏  举报