运行此代码
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 打印,该集线器正在拦截正在引发的键盘中断。通常,您会看到回溯,而不仅仅是键盘中断和当前日期,但由于集线器很特殊,因此您可以获得该输出。
您有两种方法可以解决此问题:
-
将键盘中断标记为非错误:
gevent.get_hub().NOT_ERROR += (KeyboardInterrupt,)
有了这个技巧,集线器在捕获键盘中断时不会打印任何行。这似乎是一个黑客,但它是阻止输出污染的简短而有效的方法。
-
为 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在标准错误时打印某些内容。