Я разрабатываю приложение, которое использует asyncio из python3.4 для работы в сети. Когда это приложение корректно завершает работу, узел должен «отключиться» от концентратора. Это отключение является активным процессом, для которого требуется подключение к сети, поэтому цикл должен дождаться его завершения, прежде чем завершить работу.
Моя проблема в том, что использование сопрограммы в качестве обработчика сигнала приведет к тому, что приложение не будет закрыто. Пожалуйста, рассмотрите следующий пример:
import asyncio
import functools
import os
import signal
@asyncio.coroutine
def ask_exit(signame):
print("got signal %s: exit" % signame)
yield from asyncio.sleep(10.0)
loop.stop()
loop = asyncio.get_event_loop()
for signame in ('SIGINT', 'SIGTERM'):
loop.add_signal_handler(getattr(signal, signame),
functools.partial(ask_exit, signame))
print("Event loop running forever, press CTRL+c to interrupt.")
print("pid %s: send SIGINT or SIGTERM to exit." % os.getpid())
loop.run_forever()
Если вы запустите этот пример, а затем нажмете Ctrl+C, ничего не произойдет. Вопрос в том, как мне добиться такого поведения с сигналами и сопрограммами?
asyncio.async
вместо того, чтобы напрямую вызывать ее как обработчик сигнала); вы можете опубликовать его как свой собственный ответ и принять его, чтобы другие могли видеть, что на вопрос дан ответ. Несвязанный: вы можете оскорбить некоторых волонтеров на этом сайте, предполагая, что мотивом для их помощи вам являются вымышленные точки доступа в Интернет. - person jfs   schedule 04.05.2014