首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python后台线程不能触发在atexit.register()注册的函数

python后台线程不能触发在atexit.register()注册的函数
EN

Stack Overflow用户
提问于 2015-02-04 06:27:57
回答 2查看 470关注 0票数 0

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

问题是:在这个过程的一开始,它就做atexit.register(specific_cleanup_func)。一旦客户端识别服务器处于糟糕状态,后台线程将执行general_cleanup_func()os.kill(os.getpid(), signal.SIGTERM)。我希望后台线程调用的os.kill()将触发已注册的specific_cleanup_func,但事实并非如此。我还试图从后台线程调用sys.exit(),但是进程没有退出。我想知道如何在杀死进程的同时从后台线程触发已注册的函数,或者如何让后台线程要求主线程执行所有这些清理工作和sys.exit()

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-04 06:39:13

atexit模块仅在程序“正常”退出时执行,例如,使用sys.exit(1)。必须添加信号处理程序才能捕获"os.kill“信号,如下所示:

代码语言:javascript
运行
复制
import sys
from signal import signal, SIGTERM


signal(SIGTERM, lambda signum, stack_frame: sys.exit(1))
atexit.register(specific_cleanup_func)
票数 2
EN

Stack Overflow用户

发布于 2015-02-04 06:35:58

背景任务不应该试图扼杀前台任务--它可能正在做一些重要的事情。后台任务应传递“重新启动所需”的状态,前台任务应在方便时或在提示用户之后退出。这将是当前状态检查的扩展。

在后台线程中,可以定期从前台获取状态,前台可以根据返回的状态采取行动。您还可以为它调用的后台线程提供一个回调,这样就会出现问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28314822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档