Serialization multiprocessing.pool.MaybeEncodingError:发送结果时出错:原因:';TypeError(“无法序列化';”io.BufferedReader';对象&,)';

Serialization multiprocessing.pool.MaybeEncodingError:发送结果时出错:原因:';TypeError(“无法序列化';”io.BufferedReader';对象&,)';,serialization,multiprocessing,threadpool,bufferedreader,python-multiprocessing,Serialization,Multiprocessing,Threadpool,Bufferedreader,Python Multiprocessing,我得到以下错误: multiprocessing.pool.MaybeEncodingError: Error sending result: '<multiprocessing.pool.ExceptionWithTraceback object at 0x7f758760d6a0>'. Reason: 'TypeError("cannot serialize '_io.BufferedReader' object",)' 错误是什么意思?我如何修复它?前几条建议: 您应该始终检

我得到以下错误:

multiprocessing.pool.MaybeEncodingError: Error sending result: '<multiprocessing.pool.ExceptionWithTraceback object at 0x7f758760d6a0>'. Reason: 'TypeError("cannot serialize '_io.BufferedReader' object",)'

错误是什么意思?我如何修复它?

前几条建议:

  • 您应该始终检查项目的维护情况。显然,
    wget
    包不是
  • 您应该检查包使用的是哪个libs,以防发生类似的情况
  • 现在,我们来谈谈这个问题

    显然,
    wget
    使用
    urlib.request
    发出请求。经过一些测试,我得出结论,它不能处理所有HTTP状态代码。更具体地说,当HTTP状态为(例如)304时,它会以某种方式中断。这就是为什么您必须使用具有更高级别接口的库。甚至
    urllib.request
    也在官方声明中这样说:

    建议将Requests包用于更高级别的HTTP客户端接口

    因此,不用再多说,这里是工作片段

    您只需更新要保存文件的位置即可

    from multiprocessing import Pool
    
    import shutil
    import requests
    
    
    def f(args):
        print(args)
        req = requests.get(args[1], stream=True)
        with open(str(args[0]), 'wb') as f:
            shutil.copyfileobj(req.raw, f)
    
    if __name__ == "__main__":
        a = Pool(2)
        a.map(f, enumerate(urls))  # urls is a list of urls.
    

    shutil
    lib用于文件操作。在这种情况下,将数据流传输到文件对象。

    您是在Windows还是Linux上运行此操作?这是Python2.7还是3.X?ubuntu 16.04 python3.5这个答案的可能副本并没有真正解释为什么会发生错误没有完整的堆栈跟踪和
    wget
    库的版本,如何知道错误的来源?此外,没有足够的信息来重新创建正在使用的环境。
    from multiprocessing import Pool
    
    import shutil
    import requests
    
    
    def f(args):
        print(args)
        req = requests.get(args[1], stream=True)
        with open(str(args[0]), 'wb') as f:
            shutil.copyfileobj(req.raw, f)
    
    if __name__ == "__main__":
        a = Pool(2)
        a.map(f, enumerate(urls))  # urls is a list of urls.