进程池之间共享变量是不能使用上文方式的,因为进程池内进程关系并非父子进程,想要共享,必须使用 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}