Hi,
On 27 April 2014 11:20, <[email protected]> wrote:
> I am developing an application that uses asyncio from python3.4 for
> networking. When this application shuts down cleanly, a node needs to
> "disconnect" from the hub.
> This disconnect is an active process that requires a network connection so
> the loop needs to wait for this to complete before shutting down.
>
> My issue is that using a coroutine as a signal handler will result in the
> application not shutting down. Please consider the following example:
>
> 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()
>
> If you run this example and then press Ctrl+C, nothing will happen.
> The question is, how do I make this behavior happen with siganls and
> coroutines?
>
The signal handler cannot return a coroutine.
If you replace:
loop.add_signal_handler(getattr(signal, signame),
functools.partial(ask_exit,
signame))
with
loop.add_signal_handler(getattr(signal, signame), lambda: asyncio.async(
ask_exit(signame)))
your example will work fine.
The async function runs your coroutine in the event loop.
>
> PS: If you want to earn points, I have also asked this on stackoverflow:
>
> https://stackoverflow.com/questions/23313720/asyncio-how-can-coroutines-be-used-in-signal-handlers
>
--
http://lucasbardella.com