Python 多进程 multiprocessing 实现进程通讯间通讯 <一>进程池

进程池之间共享变量是不能使用上文方式的,因为进程池内进程关系并非父子进程,想要共享,必须使用 Manager 模块来定义。

多进程除pipe和queue外 ,共享变量方式   multiprocessing.Manager()

mydict = multiprocessing.Manager().dict()  # 主进程与子进程共享这个字典
mylist = multiprocessing.Manager().list(range(2))  # 主进程与子进程共享这个List

 确保数据准确性可以加锁控制:

lock = multiprocessing.Lock()  #定义锁
lock.acquire() #加锁
lock.release()  #释放锁

 方式一:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import multiprocessing


def func(mydict, mylist, i, lock):
    lock.acquire()

    mydict["total"] +=1 # 子进程改变dict,主进程跟着改变
    if i==0:
        mydict["err"] +=1

    mylist[0] += 1
    mylist[1] += 1

    lock.release()


if __name__ == "__main__":
    lock = multiprocessing.Lock()
    mydict = multiprocessing.Manager().dict()  # 主进程与子进程共享这个字典
    mylist = multiprocessing.Manager().list(range(2))  # 主进程与子进程共享这个List

    mydict["total"] = 0  # 子进程改变dict,主进程跟着改变
    mydict["err"] = 0
    i = 0

    print "mylist===",mylist
    print "mydict===",mydict


    recprdprocess=[]  #记录打开的进程
    for i in range(3): #开三个进程
        p = multiprocessing.Process(target=func, args=(mydict, mylist, i,lock))
        p.start()
        recprdprocess.append(p)

    for pro in recprdprocess:  #子进程运行结束后再执行父进程,防止出现僵尸进程
        pro.join()

    print "mylistres===", mylist
    print "mydictres===", mydict


结果展示:

方式二、

#!/usr/bin/python
# -*- coding: utf-8 -*-
from multiprocessing import Pool, Manager
 
 
def func(my_list, my_dict):
    my_list.append(13)
    my_list.append(6)
    # my_list=[12,10]  还有一点需要注意,在共享 list 时,像下面这样写 func 是不起作用的
    my_dict['a'] = 1
    my_dict['b'] = 2
 
 
if __name__ == '__main__':
    manager = Manager()
    my_list = manager.list()
    my_dict = manager.dict()
 
    pool = Pool(processes=2)
    for i in range(0, 2):
        pool.apply_async(func, (my_list, my_dict))
    pool.close()
    pool.join()
 
    print(my_list)   #[13, 6, 13, 16]
    print(my_dict)   #{'a': 1, 'b': 2}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值