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版本淘汰.
| 归档时间: |
|
| 查看次数: |
3547 次 |
| 最近记录: |