pyzmq Tornado ioloop: 如何优雅处理KeyboardInterrupt?

2 投票
1 回答
1712 浏览
提问于 2025-04-17 21:43

我可以在我的pyzmq事件循环中捕捉到键盘中断(KeyboardInterrupt):

try:
    ioloop.IOLoop.instance().start()
except KeyboardInterrupt:
    pass

但是这样做只是让事件循环突然停止。我想要在检测到键盘中断后,手动关闭事件循环,并进行一些清理工作。请问我该怎么做呢?

1 个回答

6

使用 signal 模块来处理 SIGINT 信号:

import signal
from tornado.ioloop import IOLoop

def on_shutdown():
    print('Shutting down')
    IOLoop.instance().stop()

if __name__ == '__main__':
    ioloop = IOLoop.instance()

    signal.signal(signal.SIGINT, lambda sig, frame: ioloop.add_callback_from_signal(on_shutdown))

    ioloop.start()

撰写回答