# 通过Manager创建线程间共享的字典,列表等
"""Manager
使用Manger创建的字典,列表等在不同进程中是可以共享的
和Queue类似,需要将创建的实例以参数的形式传入子进程在进行调用
"""
from multiprocessing import Process, Manager
"""
1、Foo函数的形参d是Manager创建的字典,l是Manager创建的列表,n表示是第几个进程(for 循环创建)
2、对字典列表进行操作(赋值),如果该字典和列表是共享的,最后打印时,会打印每个进程对字典和列表的操作
"""
def foo(d, l, n):
d[n] = 1 # 每执行一次,都会对该字典进行一次赋值,注意字典格式key:value(n是key并不是index(索引)),不要和列表混淆
d[99] = None # 每次赋值都一样
l.append(n) # 每执行一次都会在列表中添加n的值
"""
1、使用Manager创建字典d和列表l
2、创建空列表p_list,后续会将所有创建的子进程放入该列表进行join,详见‘进程的start和join’部分
3、因为使用了with...as的格式。注意缩进
"""
if __name__ == '__main__':
with Manager() as manager: # 效果等同于manager = Manger(),但是下面的代码要缩进
d = manager.dict()
l = manager.list(range(1, 4)) # 对列表设置初始值
p_list = []
for i in range(1, 4): # 通过循环创建三个子进程,并传递参数,对字典和列表进行赋值
p = Process(target=foo, args=(d, l, i))
p.start()
p_list.append(p)
for j in p_list:
j.join()
print(d)
print(l)
"""
通过结果可以看到,每个进程都可以对这个字典和列表进行赋值,3个进程在字典和列表中都进行了赋值
"""