zoukankan      html  css  js  c++  java
  • 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

      

  • 相关阅读:
    深入理解计算机操作系统(十)
    深入理解计算机操作系统(九)
    深入理解计算机操作系统(八)
    深入理解计算机操作系统(七)
    深入理解计算机操作系统(六)
    深入理解计算机操作系统(五)
    mysql创建新用户
    沙特女性终于开车上路,仍有男性对此不爽
    为什么人们爱听有声书?
    韩流来袭,英文歌曲的垄断地位被撼动
  • 原文地址:https://www.cnblogs.com/dong-/p/9520862.html
Copyright © 2011-2022 走看看