这是代码:
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()函数内部,它将起作用。但是我不想多次打开文件。
答案 0 :(得分:2)
问题是open(...)
返回一个file object,并且您要将同一文件对象传递给您在顶层创建的所有start()
协程。恰好先调度的协程实例将作为session.post()
参数的一部分将文件对象传输到data
,而session.post()
将读取文件到最后并关闭文件对象。下一个start()
协程将尝试从现在关闭的对象中读取,这将引发异常。
要解决此问题而不多次打开文件,您需要确保实际读取作为字节对象:
data = {'file': open('test_img.jpg', 'rb').read()}
这会将相同的字节对象传递给所有协程,它们应按预期工作。