进程间的数据通信与数据共享

进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的

进程通信

队列

import multiprocessing

def run(q):
    q.put('hello')
    q.put('mainprocess')
    print('subprocess q ID:',id(q))

if __name__ == '__main__':
    q=multiprocessing.Queue()#用于进程间通信的队列
    t=multiprocessing.Process(target=run,args=(q,))
    t.start()
    t.join()

    print('main process q ID:',id(q))
    print(q.get())
    print(q.get())
'''
subprocess q ID: 2359100652232
main process q ID: 2025858869736
hello
mainprocess
'''

管道

import multiprocessing
def foo(conn):
    data=conn.recv()
    print(data)
    conn.send('subprocess conn id is %s'%(id(conn)))
    print('this is subprocess')
if __name__ == '__main__':
    parent_conn,child_conn=multiprocessing.Pipe()#用管道PIPE得到类似tcp的conn,从而进行双向通信(因为不涉及网络传输,所以可以不用转码)
    t=multiprocessing.Process(target=foo,args=(child_conn,))
    t.start()
    parent_conn.send('hello subprocess,main proess conn id is %s'%(id(parent_conn)))
    print(parent_conn.recv())

'''
hello subprocess,main proess conn id is 2188825603096
this is subprocess
subprocess conn id is 2818361495736
'''

共享数据

进程间数据是独立的,可以借助于队列或管道实现通信,二者都是基于消息传递的

虽然进程间数据独立,但可以通过Manager实现数据共享,事实上Manager的功能远不止于此

Manager支持的类型有list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和Array

import multiprocessing
def fun(d,l,i):
    d[i]='2'
    l.append(i)
    print('son process id',id(d),id(l))
if __name__ == '__main__':
    with multiprocessing.Manager() as manager:
        d=manager.dict()
        l=manager.list()
        print('main process d  is %s and l is %s'%(d,l))
        print('main process d ID is %s and l ID is %s'%(id(d),id(l)))
        p_list=[]
        for i in range(6):
            t=multiprocessing.Process(target=fun,args=(d,l,i))
            p_list.append(t)
            t.start()
        for t in p_list:
            t.join()
        print(d)
        print(l)
'''
main process d  is {} and l is []
main process d ID is 1304911555608 and l ID is 1304915564584
son process id 1782039016000 1782042035144
son process id 1888584888896 1888587908152
son process id 2214483358104 2214486381456
son process id 1443060675080 1443063694392
son process id 2225121096200 2225123677408
son process id 2640201478664 2640204502016
{0: '2', 1: '2', 2: '2', 3: '2', 4: '2', 5: '2'}
[0, 1, 2, 3, 4, 5]
'''



猜你喜欢

转载自blog.csdn.net/henry_lv/article/details/80049945