Why can't I catch SIGINT when asyncio event loop is running?

半世苍凉 提交于 2019-12-04 02:10:39

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 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, so hopefully my workaround will be made obsolete by that Python version.

I've found that while executing an asyncio event loop, my program can't be interrupted (i.e. by pressing Ctrl+C in the terminal)

To clarify: ctrl-C may not work, but ctrl-break works just fine.

Normally, you would add a callback for these with loop.add_signal_handler() but apparently unfortunately this functionality is not supported with the inbuilt Windows event loops :/

A periodic check could be used, yes. Otherwise the loop runs outside of signal module's ability to trap signals.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!