我收到以下错误:
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.
该错误是什么意思以及如何修复它?
首先的几个建议:
- 您应该经常检查项目的维护情况。显然
wget
包不是。
- 您应该检查包使用了哪些库,以防发生类似情况。
现在,说到问题。
显然wget
uses urllib.request
用于提出请求。经过一些测试,我得出的结论是它不能处理所有 HTTP 状态代码。更具体地说,当 HTTP 状态为以下情况时,它会以某种方式中断:304
。这就是为什么您必须使用具有更高级别接口的库。即便是urllib.request
官方是这么说的文档 https://docs.python.org/3/library/urllib.request.html#module-urllib.request:
对于更高级别的 HTTP 客户端接口,建议使用 Requests 包。
因此,事不宜迟,这是工作片段。
您只需更新要保存文件的位置即可。
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 用于文件操作。在本例中,将数据流式传输到文件对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)