最近需要实现一个服务程序的graceful exiting,保证在退出前关闭所有已创建的子线程
python借助
KeyboardInterrupted
异常响应键盘中断,因此首先尝试在子线程中try-catch这个异常(失败)
查阅原因,键盘中断只有主线程可以响应并处理,子线程无法收到这个异常。因此可以使用类似这样的结构:
cond = True
def start_task():
while cond:
# do something
def terminate_task():
# break some conditions
cond = False
def main():
_t = Thread(target=start_task)
_t.start()
try:
while True:
pass
finally:
terminate_task()
_t.join()
if __name__ == '__main__':
main()
除此之外,查阅资料发现python的
signal
包可以实现类似java的钩子,处理程序终止信号。用法可以参考https://blog.csdn.net/weixin_42350212/article/details/80588973