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)
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM