Ответ
В одном потоке Python может быть только один активный (running) event loop asyncio
.
Почему так?
Event loop является центральным диспетчером, который управляет всеми асинхронными задачами, колбэками и сетевыми событиями в рамках одного потока. Наличие двух одновременно работающих диспетчеров привело бы к неопределенному поведению и конфликтам.
Хотя можно создать несколько экземпляров event loop, запустить (run_until_complete
, run_forever
) можно только один. Попытка запустить или получить другой event loop, когда один уже активен, вызовет ошибку RuntimeError
.
Пример:
import asyncio
async def main():
print("Основной event loop работает")
# Попытка создать и запустить вложенный loop приведет к ошибке
try:
loop = asyncio.new_event_loop()
loop.run_forever() # Эта строка вызовет RuntimeError
except RuntimeError as e:
print(f"Ошибка: {e}")
# asyncio.run() автоматически создает, запускает и закрывает event loop
asyncio.run(main())
Для реализации настоящего параллелизма с несколькими event loop'ами каждый из них должен работать в своем собственном потоке (threading
).