首页
学习
活动
专区
圈层
工具
发布

十、python学习笔记-进程-进程通信之Manager

代码语言:javascript
复制
# 通过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个进程在字典和列表中都进行了赋值
"""
下一篇
举报
领券