接收linux信号并与线程交互

时间:2010-11-25 19:50:58

标签: python linux multithreading signals

大家好!:) 我有一个程序,有n个线程(可能很多),他们做了相当广泛的工作。我的问题是,有时一些人关闭或重新启动服务器(该程序在公司服务器中运行一整天)我知道有一种方法来为linux信号做一个处理程序我想知道我应该做什么来与之交互使它们使用的所有线程运行一个函数然后停止工作。有办法做到这一点吗?

抱歉英语不好:P

3 个答案:

答案 0 :(得分:2)

处理此问题的最佳方法是根本不需要任何关机操作。

例如,(例如)SIGTERM或SIGQUIT的信号处理程序只需调用_exit并退出进程而不进行清理。

在Linux下(使用非古老的线程)当一个线程调用_exit(或者如果你真的想要退出)时,其他线程也会被停止 - 无论他们在做什么。

这很好,因为它实现了仅崩溃的设计。

服务器的仅崩溃设计基于机器可能在任何时候崩溃的原则,因此您无论如何都需要能够从这样的故障中恢复,因此只需使其成为正常的退出方式。不需要额外的代码,因为无论如何你的服务器应该足够强大。

答案 1 :(得分:1)

关于你唯一能做的就是从你的信号处理程序设置一个全局变量,让你的线程定期检查它的值。

答案 2 :(得分:1)

正如其他人已经提到的那样,信号处理程序可能会变得混乱(由于限制,特别是在多线程程序中),因此最好选择其他选项:

  • 有一个专门的线程来处理来自sigwaitinfo的信号 - 但是,坏消息是python似乎不支持开箱即用。

  • 使用特定于Linux的signalfd来处理信号(在单独的线程中或集成到某个事件循环中) - 至少可以使用python-signalfd模块。

由于此处不需要安装信号处理程序,因此当您收到信号通知时,您可以执行的操作没有任何限制,并且应该可以轻松地干净地关闭程序中的其他线程。