zoukankan      html  css  js  c++  java
  • Python 进程间数据交互

    进程间通信:进程之间必须需要中间件。

    不同进程间内存是不共享的,要想实现两个进程间的数据交换
     
     
    Queues:实现传输两个进程的数据
      线程queue,访问数据只能在一个进程内进行线程与线程之间的访问。
      进程queue,可以作为一个中间键来实现两个进程的数据交互,queue通过,pickle的方式序列化父进程将数据取,在反序列化给子进程,实际上是克隆了一分数据。
    from multiprocessing import Process, Queue
    
    def f(q): # 主进程传入数据 q.put([42, None, 'hello']) if __name__ == '__main__': # 实例化进程queue q = Queue() # 实例一个子进程,调用f,args=获取q.put克隆数据 p = Process(target=f, args=(q,)) # 执行进程 p.start() # 获取数据 print(q.get()) # 等待进程执行完 p.join()
     
    Pipes:实现链接进程数据的传递
      返回由管道连接的一对连接对象,默认情况下是双向的,与socket类似建立两端。
    from multiprocessing import Process, Pipe
    def f(conn): # 子进程发送父进程端 conn.send([42, None, 'hello from child']) print(conn.recv()) conn.close() if __name__ == '__main__': # 生成管道实例。 # 生成两个管道对象:parent_conn主,child_conn子 parent_conn, child_conn = Pipe() # 生成主进程 args=连接对象 p = Process(target=f, args=(child_conn,)) p.start() # 接收子进程端 print(parent_conn.recv()) parent_conn.send("Stupid son") p.join()
    Managers:实现进程间数据的共享
      manager返回的Managers()控制一个服务器进程,该进程包含Python对象,并允许其他进程使用代理操纵它们。
      由manager()返回的管理器将支持类型列表、命令、名称空间、锁、锁、信号量、BoundedSemaphore、条件、事件、Barrier、队列、值和数组。
      managers表面看的共享,实际上是克隆了n个数据后,在合成。
    from multiprocessing import Process, Manager
    import os
    
    def f(d, l):
    
        # 存入每个进程PID到字典
        d[os.getpid()] = os.getpid()
    
        # 每个进程放入进程ID
        l.append(os.getpid())
        print(l)
    
    if __name__ == '__main__':
    
        # Manager() 赋值变量为 manager
        with Manager() as manager:
    
            # 生成一个字典.dict(),可在多个进程传递共享的字典
            d = manager.dict()
    
            # 生成一个列表.list(),可在多个进程传递共享的列表
            l = manager.list()
            p_list = []
            for i in range(10):
    
                # 生成10个进程,args=(字典,列表)
                p = Process(target=f, args=(d, l))
    
                # 执行进程
                p.start()
    
                # 对象存放在空的列表内
                p_list.append(p)
    
            # 等待结果
            for res in p_list:
                res.join()
    
            print(d)
            print(l)
  • 相关阅读:
    GridView使用CommandField删除列实现删除时提示确认框
    Web开发-表单验证
    GridView使用CommandField删除列实现删除时提示确认框
    c#中的delegate(委托)和event(事件)
    Asp.Net中的三种分页方式
    java数组,遍历数组
    Java循环结构
    java选择结构
    易混运算符
    局部变量与成员变量
  • 原文地址:https://www.cnblogs.com/xiangsikai/p/8185111.html
Copyright © 2011-2022 走看看