Есть несколько вещей, которые не совсем подходят вашему примеру:
Вы ничего не запускаете одновременно. Когда вы await resp.read()
в своем for l oop, это блокирует main
, пока не вернется результат. Возможно, это то, что вы хотите, но вам нужно использовать asyncio.create_task
для одновременного выполнения ваших запросов.
Как уже отмечалось, вам вообще не нужен массив task
, потому что пункта номер один. Вы можете просто добавить к html_list
.
Вам не нужно звонить asynio.wait
, потому что вы не ожидаете никаких задач или сопрограмм на этом этапе.
Вы можете решить свои прямые проблемы с помощью того, что вы сделали в комментариях, но версия, которая работает одновременно, выглядит так:
import asyncio
import aiohttp
async def read_url(session, url):
async with session.get(url) as resp:
return await resp.read()
async def main():
tasks = []
async with aiohttp.ClientSession() as session:
for url in ['http://www.apple.com', 'http://www.google.cl']:
tasks.append(asyncio.create_task(read_url(session, url)))
html_list = await asyncio.gather(*tasks)
print(html_list[0])
print(html_list[1])
if __name__ == '__main__':
asyncio.run(main())
Здесь мы определяем сопрограмму read_url
, которая получает содержимое одного URL. Затем в l oop вы создаете задачу для чтения URL-адреса и добавляете ее в список tasks
. Затем вы используете asyncio.gather
- это будет ждать, пока все задачи завершатся sh одновременно.
Как написано, я не могу воспроизвести вашу RuntimeError: Event loop is closed
ошибку.