python后台线程无法触发在atexit.register()上注册的函数

python后台线程无法触发在atexit.register()上注册的函数,python,multithreading,Python,Multithreading,我有一个客户机和服务器模型。服务器定期将其健康状况发送给客户端。客户端有一个后台线程来处理它(主线程正在做其他事情)。一旦客户机注意到服务器处于错误状态,它将执行一些清理工作,然后自杀(杀死客户机进程) 问题是: 在流程的最开始,它会执行atexit.register(specific_cleanup_func)。一旦客户端识别出服务器处于错误状态,后台线程将执行常规清理功能

我有一个客户机和服务器模型。服务器定期将其健康状况发送给客户端。客户端有一个后台线程来处理它(主线程正在做其他事情)。一旦客户机注意到服务器处于错误状态,它将执行一些清理工作,然后自杀(杀死客户机进程)

问题是:
在流程的最开始,它会执行atexit.register(specific_cleanup_func)。一旦客户端识别出服务器处于错误状态,后台线程将执行
常规清理功能
os.kill(os.getpid(),signal.SIGTERM)
。我希望后台线程调用的
os.kill()
将触发注册的
特定的\u cleanup\u func
,但事实并非如此。我还尝试从后台线程调用sys.exit(),但进程没有退出。我想知道在终止进程时如何从后台线程触发已注册的函数,或者如何让后台线程要求主线程执行所有这些清理工作,以及
sys.exit()

后台任务不应该尝试终止前台任务-它可能正在做一些重要的事情。后台任务应通过“需要重新启动”状态,前台任务应在方便时或提示用户后退出。这将是您当前状态检查的扩展


在后台线程中,可以定期从前台获取状态,前台可以根据返回的状态采取操作。您还可以向出现问题时调用的后台线程提供回调。

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)

你能说得更具体些吗?如何让后台线程告诉主线程“我需要你做点什么”?“服务器定期向客户端发送其健康状态”-只需让它使用相同的机制发送请重新启动-例如,如果当前的“我很好”是1发送-1改为!无论服务器向客户端发送什么,都是客户端的后台线程负责。正如您所提到的,要求后台线程结束进程不是一个好方法。然后我想知道后台线程如何告诉主线程“请做这些事情并退出进程”?