进程间通讯

Process类

构造方法
Process([group [, target [, name [, args [, kwargs]]]]])

group: 线程组,目前还没有实现,库引用中提示必须是None;
target:要执行的方法;
name:进程名;
args/kwargs:要传入方法的参数。

实例方法:

is_alive():返回进程是否在进行。
join([timeout]):阻塞当前上下文环境的进程,直到调用此方法的进程终止或达到指定的timeout(可选参数)。
start():进程准备就绪,等待CPU调度
run():start()调用run方法,如果实例进程时未制定传入target,这start执行默认run()方法。
terminate():不管任务是否完成,立即停止工作进程

属性

daemon:和线程的setDeamon功能一样
name:进程名字
pid:进程号

进程间通讯

进程队列Queue

import multiprocessing
import time


def setData(q):
    time.sleep(1)
    q.put(123)
    q.put('lupe')


def getData(q):
    print(q.get())
    print(q.get())
    print('sub process', id(q))


if __name__ == '__main__':
    q = multiprocessing.Queue()
    p1 = multiprocessing.Process(target=setData, args=[q])
    p1.start()
    print('main process', id(q))
    getData(q)

管道

rom multiprocessing import Process, Pipe

def f(conn):
    conn.send([12, {"name": "lupe"}, "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()

Managers

Queue和pipe只是实现了数据交互,并没有实现数据共享,即一个进程去更改另一个进程的数据。

from multiprocessing import Process, Manager

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

    print('sub process:', id(d), id(l))

if __name__ == '__main__':
    with Manager() as manager:
        d = manager.dict() # {}
        l = manager.list(range(5)) # [0, 1, 2 ,3, 4]

        print('main process:', id(d), id(l))
        p_list = []

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

        for p in p_list:
            p.join()
        print(d)
        print(l)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值