python gevent:键盘中断中的意外输出



运行此代码

import gevent
def f():
while True:
gevent.sleep(1)
if __name__ == '__main__':
tasks = (gevent.spawn(f),)
try:
gevent.wait(tasks)
except KeyboardInterrupt:
print("KeyboardInterrupt trapped")

然后按 Ctrl-C,给我这个输出:

$ python receiver.py 
^CKeyboardInterrupt
Tue Aug  8 00:56:04 2017
KeyboardInterrupt trapped

为什么?
似乎有人在输出上写入退出时间。
如何防止第一行中的KeyboardInterrupt和第二行中的日期?

这些消息由 gevent Hub 打印,该集线器正在拦截正在引发的键盘中断。通常,您会看到回溯,而不仅仅是键盘中断和当前日期,但由于集线器很特殊,因此您可以获得该输出。

您有两种方法可以解决此问题:

  1. 将键盘中断标记为非错误:

    gevent.get_hub().NOT_ERROR += (KeyboardInterrupt,)
    

    有了这个技巧,集线器在捕获键盘中断时不会打印任何行。这似乎是一个黑客,但它是阻止输出污染的简短而有效的方法。

  2. 为 SIGINT 注册信号处理程序:

    def handler(signum, frame):
    print('SIGINT trapped')
    sys.exit(0)
    signal.signal(signal.SIGINT, handler)
    

    SIGINT 的默认信号处理程序将引发 KeyboardInterrupt,但如果定义自己的信号处理程序,则可以阻止它并运行清理代码。

    请务必在处理程序函数出现异常的情况下退出,否则不会停止对gevent.wait()的调用。您可以使用的唯一两个例外是SystemExit和GreenletExit(这是上面NOT_ERROR列表中的两个默认例外(:任何其他异常都会导致gevent在标准错误时打印某些内容。

相关内容

  • 没有找到相关文章

最新更新