asyncio aiohttp-客户端读取的关闭文件错误

时间:2018-12-11 15:31:13

标签: python python-requests python-asyncio aiohttp

这是代码:

dimension3

我得到一个错误:

import asyncio
import aiohttp
loop = asyncio.get_event_loop()
session = aiohttp.ClientSession(loop=loop)
data = {'file': open('test_img.jpg', 'rb')}

async def start():
        async with session.post("http://localhost", data=data) as response:
            text = await response.text()
            print(text)

loop.run_until_complete(asyncio.gather(*[start() for i in range(20)]))

但是,如果我将ValueError: read of closed file 调用移到start()函数内部,它将起作用。但是我不想多次打开文件。

1 个答案:

答案 0 :(得分:2)

问题是open(...)返回一个file object,并且您要将同一文件对象传递给您在顶层创建的所有start()协程。恰好先调度的协程实例将作为session.post()参数的一部分将文件对象传输到data,而session.post()将读取文件到最后并关闭文件对象。下一个start()协程将尝试从现在关闭的对象中读取,这将引发异常。

要解决此问题而不多次打开文件,您需要确保实际读取作为字节对象:

data = {'file': open('test_img.jpg', 'rb').read()}

这会将相同的字节对象传递给所有协程,它们应按预期工作。