1. 最近在用python的multiprocessing多进程的方式去请求接口,获取数据,在这个过程中需要一个全量的字典去记录请求过的参数,这样避免重复请求,减少接口调用次数。
2. 刚好在用multiprocessing的时候可以,可以用Manager定义一个dict,这样起到全局字典的作用
from multiprocessing import Pool, Manager
manager = Manager()
skuDict = manager.dict()
我们在进程池中调用的时候,加上这个字典就可以起到全局调用的作用。
pool = Pool(5)
pool.apply_async(func=Func, args=(skuDict))
3. 刚好我想把这个定义的字典skuDIct保存到文件
刚开始这样来保存
from multiprocessing import Pool, Manager
manager = Manager()
skuDict = manager.dict()
def save_obj(obj, name):
with open(name + '.pkl', 'wb') as f:
pickle.dump(obj), f, pickle.HIGHEST_PROTOCOL)
save_obj(skuDict, "skuDict")
4. 但是加载文件的过程中发现总是报错说文件不存在: No such file or directory
加载文件
def load_obj(name ):
with open(name + '.pkl', 'rb') as f:
return pickle.load(f)
5.原来Manager.dict()是一个代理对象,它由管理器在不同进程中来管理,当该对象调用方法的时候,该调用将转发到实际字典所在的管理器。管理器和客户端进程之间的通信是pickle协议进行的。
解决办法:
如果你想有一个实际的dict,或者保存下来,可以在处理完之后保存成dict
def save_obj(obj, name):
with open(name + '.pkl', 'wb') as f:
pickle.dump(dict(obj), f, pickle.HIGHEST_PROTOCOL)