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)
  • 相关阅读:
    Django(app的概念、ORM介绍及编码错误问题)
    Django(完整的登录示例、render字符串替换和redirect跳转)
    Construct Binary Tree from Preorder and Inorder Traversal
    Single Number II
    Single Number
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Binary Tree Zigzag Level Order Traversal
    Recover Binary Search Tree
    Add Binary
  • 原文地址:https://www.cnblogs.com/xiangsikai/p/8185111.html
Copyright © 2011-2022 走看看