python 进程间的数据交互

Queue 的方式:

# -*- coding: utf-8 -*-

from multiprocessing import Queue,Process

'''
将queue 通过参数的形式进行传递,这个queue 实际是复制一份到子进程中,当子进程的queue改变后
会有一个中间方将queue进行序列化 , 在反序列化到父进程的queue中

如果要使用线程的queue ,就会报一个pickle _thread lock 的异常,就是因为线程的queue 不能被序列化导致的
'''

def f(q1):
    q1.put('aaa')

if __name__=='__main__':
    q = Queue()
    p = Process(target = f,args=(q,))
    p.start()
    print(q.get())
    p.join()

管道方式 :

# -*- coding: utf-8 -*-

from multiprocessing import Process,Pipe

def run(conn):
    conn.send('aaa')
    conn.close()


if __name__=='__main__':
    parent_conn,child_conn = Pipe()
    p = Process(target=run,args=(child_conn,))
    p.start()
    print(parent_conn.recv())
    p.join()

manager 方式:

# -*- coding: utf-8 -*-
'''
用 manager.dict() 和manager.list()生成的 列表和字典可以实现共享

一般进程间的共享使用这种方式
'''
from multiprocessing import Process,Manager

def f(d,l):
    d[1]='1'
    d['2']=2
    d[0.25]=None
    l.append(1)
    print(l)

if __name__=='__main__':
    with Manager() as manager:
        #生成一个字典 , 可在多个进程间传递
        d = manager.dict()
        
        l = manager.list(range(5))
        p_list=[]
        for i in range(10):
            p = Process(target=f,args=(d,l))
            p.start()
            p_list.append(p)
        
        for res in p_list:
            res.join()
            
        print(d)
        print(l)