Почему на Windows выдается ошибка "RuntimeError: Event loop is closed"?

Выдается ошибка указанная в заголовке при использовании Python 3.10 на Windows. По умолчанию, начиная с версии 3.8 используется ProactorEventLoop. Мне не совсем понятно, а почему, если оставить по-умолчанию, то выдается ошибка, а если применить asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy(), то ошибка исчезает.

Вот пример кода:

from aiohttp import ClientSession # pip install aiohttp
import asyncio


HEADERS = {
  'user-agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36 OPR/80.0.4170.63',
  'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'
}

URLS = ['https://www.ya.ru', 'https://www.google.com', 'https://www.mail.ru']


async def fetch_page(session, queue):
  url = await queue.get()
  async with session.get(url, allow_redirects=True, headers=HEADERS) as response:
    result = await response.text()
    print(f'Downloaded "{url}" with {len(result)} bytes')
    queue.task_done()
    return result


async def main():
  queue = asyncio.Queue()
  tasks = []
  async with ClientSession(raise_for_status=True) as session:
    for url in URLS:
      queue.put_nowait(url)
      task = asyncio.create_task(fetch_page(session, queue))
      tasks.append(task)

    await asyncio.gather(*tasks)


if __name__ == '__main__':
  # asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
  asyncio.run(main())

Ответы (0 шт):