为什么我不能在asyncio事件循环运行时捕获SIGINT?

akn*_*ds1 12 windows signals event-loop python-3.4 python-asyncio

在Windows上使用Python 3.4.1,我发现在执行asyncio事件循环时,我的程序不能被中断(即在终端中按Ctrl + C).更重要的是,SIGINT信号被忽略.相反,我已经确定在不在事件循环中时处理SIGINT.

为什么执行asyncio事件循环时会忽略SIGINT?

下面的程序应该演示问题 - 在终端中运行它并尝试通过按Ctrl + C来停止它,它应该继续运行:

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')
Run Code Online (Sandbox Code Playgroud)

请参阅官方(郁金香)邮件列表上的讨论.

akn*_*ds1 10

我找到了一种解决方法,即安排定期回调.在运行时,SIGINT显然已经处理:

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')
Run Code Online (Sandbox Code Playgroud)

不确定为什么这是必要的,但它表明在事件循环等待事件时信号被阻塞("民意调查").

这个问题已经在官方(Tulip)邮件列表上进行了讨论,我的解决方法显然是现在的方法.

更新

据推测,修复程序已经进入Python 3.5,所以希望我的解决方法将被Python版本淘汰.

  • 在3.6.0中遇到同样的问题,所以bug仍然存在. (3认同)

小智 6

我发现在执行asyncio事件循环时,我的程序无法中断(即在终端中按Ctrl + C)

澄清一下:ctrl-C可能不起作用,但ctrl-break工作正常.