上一篇写了简单的并行模板
https://blog.csdn.net/HaoZiHuang/article/details/127267686
但是有时候,用到一个全局的 list 或者 dict 直接用普通的list不太行
举个例子:
import json
import glob
from pprint import pprint
import pickle
from multiprocessing import Pool, Manager
from functools import partial
file_path_list = []
data_dic = {}
data_list_dic = {}
def single(jn):
# 每个进程将结果放到以上三个 列表/字典 里
# 比如
file_path_list.append(jn)
if __name__ == "__main__":
jn_list = [1, 2, 3]
with Pool(processes=16) as pool:
pool.map(single, jn_list)
这样做最后的 file_path_list
依旧是空的,不论放在 if __name__ == "__main__":
下,还是在其之外,最后的 file_path_list
也是空的
参考了这篇:
多进程之间共享变量 https://zhuanlan.zhihu.com/p/166091204
需要使用共享变量:
from multiprocessing import Pool, Manager
manager = Manager()
my_list = manager.list()
my_dict = manager.dict()
改成这样的就行,给各新模板:
from multiprocessing import Pool, Manager
from functools import partial
def single(shared_list, shared_dict, single_input):
# shared_list 共享列表参数
# shared_dict 共享字典参数
......
if __name__ == "__main__":
manager = Manager()
# 用来共享的 list dict
shared_list = manager.list()
shared_dict = manager.dict()
input_list = [1, 2, 3, 4, ...]
parallel_warp = partial(single, shared_list, shared_dict)
with Pool(processes=16) as pool:
pool.map(parallel_warp, input_list)
要注意把 shared_dict 和 shared_list 当成参数传入
最后处理完毕之后,要把 shared_list 和 shared_dict 转换为普通 list 和 dict,负责可能会出现意想不到的问题
最后这样操作:
pythonlist = list(mp_list)
pythondict = dict(mp_dict)
不过,尽量不要进行进程间通讯吧… 速度好慢…