我有一个客户端和服务器模型。服务器定期将其健康状态发送给客户端。客户端有一个后台线程来处理它(主线程正在做其他事情)。一旦客户端注意到服务器处于糟糕的状态,它就会做一些清理工作,然后杀死自己(杀死客户机进程)。
问题是:在这个过程的一开始,它就做atexit.register(specific_cleanup_func)。一旦客户端识别服务器处于糟糕状态,后台线程将执行general_cleanup_func()和os.kill(os.getpid(), signal.SIGTERM)。我希望后台线程调用的os.kill()将触发已注册的specific_cleanup_func,但事实并非如此。我还试图从后台线程调用sys.exit(),但是进程没有退出。我想知道如何在杀死进程的同时从后台线程触发已注册的函数,或者如何让后台线程要求主线程执行所有这些清理工作和sys.exit()。
发布于 2015-02-04 06:39:13
atexit模块仅在程序“正常”退出时执行,例如,使用sys.exit(1)。必须添加信号处理程序才能捕获"os.kill“信号,如下所示:
import sys
from signal import signal, SIGTERM
signal(SIGTERM, lambda signum, stack_frame: sys.exit(1))
atexit.register(specific_cleanup_func)发布于 2015-02-04 06:35:58
背景任务不应该试图扼杀前台任务--它可能正在做一些重要的事情。后台任务应传递“重新启动所需”的状态,前台任务应在方便时或在提示用户之后退出。这将是当前状态检查的扩展。
在后台线程中,可以定期从前台获取状态,前台可以根据返回的状态采取行动。您还可以为它调用的后台线程提供一个回调,这样就会出现问题。
https://stackoverflow.com/questions/28314822
复制相似问题