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

时间:2018-02-13 07:57:50

标签: 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",)'

运行此代码时:

from operator import itemgetter
from multiprocessing import Pool
import wget


def f(args):
    print(args[1])
    wget.download(args[1], "tests/" + target + '/' + str(args[0]), bar=None)

if __name__ == "__main__":
    a = Pool(2)
    a.map(f, list(enumerate(urls))) #urls is a list of urls.

错误是什么意思,我该如何解决?

1 个答案:

答案 0 :(得分:1)

前几个建议:

  1. 您应该始终检查项目的维护情况。显然wget包不是。
  2. 你应该检查哪些lib是使用的包,以防这种情况发生。
  3. 现在,问题。

    显然wget使用urllib.request提出请求。经过一些测试,我得出结论,它没有处理所有HTTP状态代码。更具体地说,当HTTP状态为例如304时,它会以某种方式中断。这就是您必须使用具有更高级别接口的库的原因。即使urllib.request在官方documentation中说明了这一点:

      

    建议将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用于文件操作。在这种情况下,要将数据流式传输到文件对象。