Почему на 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())