Я думаю, что получаю эту ошибку, потому что мой код вызывает asyncio.get_event_loop().run_until_complete(foo())
дважды. Один раз из foo()
и второй раз из функции, вызванной foo()
. Тогда мой вопрос: почему это должно быть проблемой? Почему мне все равно, что этот цикл работает?
Было внесено изменение в этот вопрос, который, я думаю, скрыл его (некоторые люди предпочитают следовать правилам, не понимая их, поэтому из названия было удалено "незаконное" слово). К сожалению, это создает путаницу.
Я не удивлен тем, что ошибка поднята. Я могу отследить его до источника asyncio
и увидеть, что авторы этой библиотеки хотели сделать это таким образом, там нет таинственности. Непонятная часть заключается в том, что авторы библиотеки решили, что незаконно запрашивать из цикла событий выполнение некоторой функции до завершения, когда цикл уже запущен.
Мы можем свести проблему только к двум таким вызовам, и через анализ случаев мы увидим, что это три возможности:
- Ни одна из двух функций не заканчивается.
- Одна из функций заканчивается.
- Обе функции в конечном итоге завершаются.
Теперь, есть ли нормальное поведение, которое будет касаться всех трех случаев? Для меня очевидно, что есть, или, возможно, возможны многочисленные разумные способы поведения. Например:
- Ничего особенного, выполнение обеих функций чередуется, и они продолжают работать вечно, как и ожидалось.
- Цикл не возвращает управление коду, следующему первому экземпляру
run_until_complete()
, пока не завершится вторая функция (таким образом, код послеrun_until_complete()
не будет выполнен. - После завершения последней функции цикл возвращает управление первому объекту кода, который вызывает
run_until_complete
игнорирование всех других сайтов-вызовов.
Теперь я могу понять, что это поведение может быть не тем, что все захотят. Но, поскольку эта библиотека решила дать программистам контроль над запуском/остановкой цикла событий, она также должна отвечать последствиям таких решений. Невозможно запустить один и тот же цикл за один раз, избегая при этом этого кода библиотеки, что снижает качество и полезность библиотек, использующих asyncio
(что действительно имеет место, например, aiohttp
).