aiohttp报错concurrent.futures._base.TimeoutError的解决

今天在把一个多线程爬虫改写成使用协程的爬虫,在一个接口一直报concurrent.futures._base.TimeoutError,代码是这样的

1
2
3
4
5
6
7

async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=3)) as session:

r = await session.post(url)

_ = await r.json()

出错的位置是最后一行

其实挺奇怪的,这是一个 util,很多接口都使用这个函数,但是只有一个报错。

最后通过 https://github.com/aio-libs/aiohttp/issues/4015 找到了报错原因。

await session.post(url)实际上只是保证接收了一个 chunk,剩余部分需要使用者自行操作进行读取,为的是在得知是大文件的时候可以放弃处理,但是在我的代码里 r.json()已经跳出 with,连接已经关闭,所以读取 body 报错

修正方案即在 with 内操作 body

1
2
3
4
5
6
7

async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=3)) as session:

r = await session.post(url)

_ = await r.json()

只有一个报错原因应该就是其他接口内容较少,一个 chunk 已经包含,即内容已经完全读取。报错的这个内容多,剩余 chunks 需要手动触发接收。


aiohttp报错concurrent.futures._base.TimeoutError的解决
https://hunsh.net/archives/70/
发布于
2020年6月19日
许可协议