pickle文件加载multiprocessing.manager.dictionary报错No such file or directory

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值