A solution to exception ‘ran out of input‘ when pickle loading

by @taoqingqiu 

 

案发现场

 

故事发生在一个用于标注的 web tool 中,勤奋的用户竭尽全力地按下右键,待标注图片飞快地翻动,后台应接不暇地 pickle.load 某个与 image path 相关的变量。忽然,异常发生了。

 

image.png

 

image.png

 

原因

 

假设有一个叫 test.dict 的二进制文件,它存储了一个无关紧要的、可 pickle.load 的字典。执行如下代码:

 

import pickle

f_test = open('test.dict', 'rb')
test_dict = pickle.load(f_test)
test_dict_puppet = pickle.load(f_test)

 

则:

 

Traceback (most recent call last):
  File "<stdin>", line 5, in <module>
EOFError: Ran out of input

 

一切了然。

 

解决

 

当然,示例中的写法是为了探究原因刻意而为之,现实中,问题出现在多线程(或者多进程)同时 load 同一个变量时,解决方法可以是资源加锁,如下:

 

import pickle, fcntl

def load_func(var_path: str):
    """
    a function will be used in mutiple threads.
    """
    result = None
    if os.path.exists(var_path):
        f_var = open(var_path, 'rb')
        fcntl.flock(f_var, fcntl.LOCK_EX)  # 默认阻塞、互斥
        result = pickle.load(f_var)
        fcntl.flock(f_var, fcntl.LOCK_UN)  # 解锁后再释放
        f_var.close()
    return result

 

就这。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kang Tao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值