Python Asyncio - очистить цикл обработки событий на Ctrl + C?и закрыть () против остановки () - PullRequest
0 голосов
/ 25 декабря 2018

Код:

loop = asyncio.get_event_loop()
# add tasks to the loop
# ...

# and then run the loop
try:
   loop.run_forever()
except KeyboardInterrupt:
   print(loop)
   # Here I need to run a cleanup, I still need to use the event loop
   # Can I still use the event loop here? like:
   loop.run_until_complete(some_cleanup_coro())
  1. , когда я печатаю цикл событий в блоке except, я вижу вывод: 'WindowsSelectorEventLoop', с closed=False, running=False.Означает ли это, что я не могу использовать цикл обработки событий в блоке кроме?тогда как мне запустить сопрограмму очистки?

    Вызов run_until_complete зависает и не выполняется.Поэтому нажатие Ctrl + C не завершается, и я должен закрыть сам терминал.

  2. В чем разница между loop.close () и loop.stop (), и я должен вызывать их?Документы ничего не говорят о loop.stop ().

Мой cleanup_coro () выполняет в основном asyncio.open_connection(..) и просто отправляет и получает одно сообщение.(Как я вижу, messege не отправляется вообще).

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Означает ли это, что я не могу использовать цикл событий в блоке кроме?

Вы можете продолжать использовать цикл событий, пока он не закроется.

Таким образом, нажатие ctrl + c не завершается, и мне приходится закрывать сам терминал.

Почему Ctrl+C работает, потому что что-то работает, поэтому цикл не дает возможности принятьсигнал (Ctrl+C).Например:

import asyncio

async def go():
    await asyncio.sleep(60)

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(go())

В соответствии с вашим последним редактированием, я полагаю, что перед отправкой сообщения вам заблокирована строка кода.Но что это такое, что вам нужно опубликовать свой cleanup_coro() контент.Или вы можете использовать print(), чтобы установить метку, а затем выяснить, какая строка кода находится на рассмотрении.

В чем разница между loop.close () и loop.stop (), и мне следует вызватьэти?В документах ничего не говорится о loop.stop ().

Вы можете представить, что loop.close () и loop.stop () похожи на следующую песню и останавливают эту песню.Если вам не нужна эта песня, значит следующая.Если вы хотите продолжить задачу позже, используйте stop.Тем не менее, вам не нужно запускать задачу вообще, вы можете close цикл.Примечание: если какие-либо задачи выполняются, вы должны остановиться перед закрытием

0 голосов
/ 25 декабря 2018

В вашем блоке исключений цикл больше не работает, но не закрывается, поэтому вы можете запустить его снова (loop.run*).Это состояние возникает, когда что-то вызывает loop.stop.Asyncio сделает это за вас в случае исключений, которые всплывают в коде, запустившем цикл.Вы можете запускать и останавливать цикл так часто, как захотите.

Не зная, что делает some_cleanup_coroutine или какие другие сопрограммы все еще запланированы с циклом событий, трудно сказать, когда ваш код зависает.

Вызов loop.close не позволит вам запустить его снова.Вам нужно получить новый цикл (asyncio.new_event_loop), если вы хотите сделать больше работы.

...