【问题标题】:multiprocessing.pool.MaybeEncodingError: Error sending result: Reason: 'TypeError("cannot serialize '_io.BufferedReader' object",)'multiprocessing.pool.MaybeEncodingError:错误发送结果:原因:'TypeError(“无法序列化'_io.BufferedReader'对象”,)'
【发布时间】:2018-07-23 12:55:21
【问题描述】:

我收到以下错误:

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.

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

【问题讨论】:

标签: serialization multiprocessing threadpool bufferedreader python-multiprocessing


【解决方案1】:

前几条建议:

  1. 您应该经常检查项目的维护情况。显然wget 包不是。
  2. 您应该检查软件包使用了哪些库,以防发生这种情况。

现在,到这个问题。

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

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

所以,不用多说,这里是工作的 sn-p。

您可以只更新您想要保存文件的位置。

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

【讨论】:

  • 这个答案并没有真正解释为什么会发生错误
  • 没有完整的堆栈跟踪和wget 库的版本,如何知道错误来源?此外,没有足够的信息来重新创建正在使用的环境。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
相关资源
最近更新 更多