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

测试:跨进程的列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 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
| 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进行数据的查找,那么这一特点就非常方便于传输多个数据内容。