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)
posted @ 2018-01-03 18:29  kevin.Xiang  阅读(1114)  评论(0编辑  收藏  举报