码迷,mamicode.com
首页 > 系统相关 > 详细

进程间通讯的三种方式

时间:2018-08-19 01:02:49      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:nbsp   child   for   div   更改   manage   def   man   range   

# 进程间通讯
# 1、进程对列multiprocessing.Quere
import multiprocessing, time


def foo(q):
    time.sleep(1)
    print(‘son process‘, id(q))
    q.put(123)
    q.put(‘alex‘)


if __name__ == ‘__main__‘:
    q = multiprocessing.Queue()
    print(‘main process‘, id(q))
    p = multiprocessing.Process(target=foo, args=(q,))
    p.start()

    print(q.get())
    print(q.get())

# 2、管道 pipe()
from multiprocessing import Process, Pipe


def f(conn):
    conn.send([12, {‘name‘: ‘alex‘}, ‘hello‘])
    response = conn.recv()
    print(‘response‘, response)
    conn.close()
    print(‘q_ID2:‘, id(conn))


if __name__ == ‘__main__‘:
    parent_conn, child_conn = Pipe()  # 双向管道
    print(‘q_ID1:‘, id(child_conn))
    p = Process(target=f, args=(child_conn,))
    p.start()
    print(parent_conn.recv())
    parent_conn.send(‘儿子你好‘)
    p.join()

# 3、Managers 实现数据共享 (Queue和Pipe只是实现数据交互,没有实现数据共享,即一个进程去更改另一个进程的数据)
from multiprocessing import Process, Manager


def f(d, l, i):
    d[i] = ‘1‘  # {0: ‘1‘}
    d[‘2‘] = 2  # {0: ‘1‘, ‘2‘: 2}

    l.append(i)  # [0, 1, 2, 3, 4, 0]

    print(‘son process:‘, id(d), id(l))


if __name__ == ‘__main__‘:
    with Manager() as manager:
        d = manager.dict()  # 创建Manager字典 {}
        l = manager.list(range(5))  # 创建Manager列表 [0, 1, 2, 3, 4]

        print(‘main process:‘, id(d), id(l))

        p_list = []
        for i in range(10):
            p = Process(target=f, args=(d, l, i))
            p.start()
            p_list.append(p)

        for res in p_list:
            res.join()

        print(d)
        print(l)

 

进程间通讯的三种方式

标签:nbsp   child   for   div   更改   manage   def   man   range   

原文地址:https://www.cnblogs.com/dangrui0725/p/9499310.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!