为什么 asyncio 的事件循环会抑制 Windows 上的键盘中断?



我有一个非常小的测试程序,除了执行asyncio事件循环外,它什么都不做:

import asyncio
asyncio.get_event_loop().run_forever()

当我在 Linux 上运行此程序并按 Ctrl+C 时,该程序将正确终止,并出现KeyboardInterrupt异常。在Windows上按Ctrl + C没有任何作用(使用Python 3.4.2测试)。一个简单的带有 time.sleep() 的无限循环即使在 Windows 上也能正确提高KeyboardInterrupt

import time
while True:
    time.sleep(3600)

为什么 asyncio 的事件循环会抑制 Windows 上的键盘中断?

有适用于

Windows的解决方法。运行另一个每秒唤醒循环并允许循环对键盘中断做出反应的协同路由

来自异步文档的回显服务器示例

async def wakeup():
    while True:
        await asyncio.sleep(1)
loop = asyncio.get_event_loop()
coro = loop.create_server(EchoServerClientProtocol, '127.0.0.1', 8888)
server = loop.run_until_complete(coro)
# add wakeup HACK
loop.create_task(wakeup())
try:
    loop.run_forever()
except KeyboardInterrupt:
    pass

当然,这是一个错误。

有关问题解决进度,请参阅 python 错误跟踪器上的问题。

如果您只想退出程序而不需要捕获KeyboardInterrupt,则信号模块提供了一种更简单(且更有效)的解决方法:

# This restores the default Ctrl+C signal handler, which just kills the process
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)
# Now the event loop is interruptable
import asyncio
asyncio.get_event_loop().run_forever()

相关内容

  • 没有找到相关文章

最新更新