Why can't I catch SIGINT when asyncio event loop is running?
Question: Using Python 3.4.1 on Windows, I've found that while executing an [asyncio
event loop](https://docs.python.org/3/library/asyncio.html), my program can't
be interrupted (i.e. by pressing Ctrl+C in the terminal). More to the point,
the SIGINT signal is ignored. Conversely, I've determined that SIGINT is
handled when not in an event loop.

Why is it that SIGINT is ignored when executing an asyncio event loop?

The below program should demonstrate the problem - run it in the terminal and
try to stop it by pressing Ctrl+C, it should keep running:

    
    
    import asyncio
    import signal
    
    
    # Never gets called after entering event loop
    def handler(*args):
        print('Signaled')
    
    
    signal.signal(signal.SIGINT, handler)
    
    print('Event loop starting')
    loop = asyncio.SelectorEventLoop()
    asyncio.set_event_loop(loop)
    loop.run_forever()
    print('Event loop ended')
    

See [discussion](https://groups.google.com/forum/#!topic/python-
tulip/pr9fgX8Vh-A) on official (Tulip) mailing list.


Answer: I've found a workaround, which is to schedule a periodic callback. While this
running, SIGINT is apparently processed:

    
    
    import asyncio
    
    
    def wakeup():
        # Call again
        loop.call_later(0.1, wakeup)
    
    
    print('Event loop starting')
    loop = asyncio.SelectorEventLoop()
    # Register periodic callback
    loop.call_later(0.1, wakeup)
    asyncio.set_event_loop(loop)
    loop.run_forever()
    print('Event loop ended')
    

Not sure why this is necessary, but it indicates that signals are blocked
while the event loop waits for events ("polls").

The matter has been
[discussed](https://groups.google.com/forum/#!topic/python-tulip/pr9fgX8Vh-A)
on the official (Tulip) mailing list, my workaround is apparently the way to
go as of now.

## Update

A fix has supposedly [made its way into Python
3.5](https://code.google.com/p/tulip/issues/detail?id=191), so hopefully my
workaround will be made obsolete by that Python version.

