py并发_Manager类笔记

Manager

不同进程之间虽然可以通过管道的形式(subprocess中的输入和输出都是通过管道)可以实现数据的传输,但是如果每一次的操作都是通过管道进行处理,那么实际上就会非常的麻烦,所以为了进一步简化不同进程之间数据共享的设计问题,所以提供了一个Manager类

测试:跨进程的列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# coding: UTF-8
import multiprocessing,time # 导入多进程开发模块
def worker(list,item): # 进程的处理函数
list.append("[%s] item = %s" % (multiprocessing.current_process().name, item)) #列表存储
def main():
manager = multiprocessing.Manager() # 创建共享数据对象
main_item = "[%s] 你好,加油,小娃子" % multiprocessing.current_process().name
mgr_list = manager.list([main_item]) # 根据一个序列来创建列表
job_process = [multiprocessing.Process(target=worker,
args=(mgr_list, item,),
name="数据操作进程-%s" % item)
for item in range(3)] # 创建进程列表
for process in job_process: # 启动列表中的所有进程
process.start()
for process in job_process: # 所有进程强制执行完毕
process.join()
print("所有进程执行完毕,列表最终数据:%s" % mgr_list)
if __name__ == "__main__":
main()

所有进程执行完毕,列表最终数据:[‘[MainProcess] 你好,加油,小娃子’, ‘[数据操作进程-1] item = 1’, ‘[数据操作进程-0] item = 0’, ‘[数据操作进程-2] item = 2’]

进程已结束,退出代码0

注:此时虽然是三个进程,但是却发现可以直接进行同一个列表数据的操作,所以这个时候该列表就是一个跨进程的存在,在Manager类里面除了有List之外实际上还包含有字典

测试:跨进程的字典

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# coding: UTF-8
import multiprocessing # 导入多进程开发模块
def worker(dict,item): # 进程的处理函数
dict.update({multiprocessing.current_process().name:item})
def main():
manager = multiprocessing.Manager() # 创建共享数据对象
main_name = "[%s] 你好" % multiprocessing.current_process().name
main_value = "呵呵"
ori_dict = dict()
ori_dict[main_name] = main_value
mgr_dict = manager.dict(ori_dict) # 根据一个序列来创建共享字典
job_process = [multiprocessing.Process(target=worker,
args=(mgr_dict, item,),
name="数据操作进程-%s" % item)
for item in range(3)] # 创建进程列表
for process in job_process: # 启动列表中的所有进程
process.start()
for process in job_process: # 所有进程强制执行完毕
process.join()
print("所有进程执行完毕,列表最终数据:%s" % mgr_dict)
if __name__ == "__main__":
main()

所有进程执行完毕,列表最终数据:{‘[MainProcess] 你好’: ‘呵呵’, ‘数据操作进程-0’: 0, ‘数据操作进程-1’: 1, ‘数据操作进程-2’: 2}

进程已结束,退出代码0

注:这个时候已经可以直接实现跨进程的字典数据的保存处理操作,所以也实现了数据共享,并且使用字典进行数据共享的时候,由于字典可以根据key进行数据的查找,那么这一特点就非常方便于传输多个数据内容。


py并发_Manager类笔记
https://blog.wangxk.cc/2020/01/30/py并发-Manager类笔记/
作者
Mike
发布于
2020年1月30日
许可协议