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

in Python with 0 comment

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

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

async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=3)) as session:
    r = await session.post(url)
    _ = await r.json()

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

Responses