2010-11-25 68 views
1

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

遗憾的英文不好:P

回答

1

关于你能做的就是从你的信号处理函数设置一个全局变量,并让您的线程定期检查其价值的唯一的事情。

+0

一般来说,信号处理程序只能调用记录为“异步安全”的syscalls和记录为“可重入”的库函数。显然,为程序添加线程会增加另一层限制,因此我可以理解放弃并说“在信号处理程序中除了设置变量之外不做任何事情”的诱惑,但是我觉得它有点过于强硬。 – ephemient 2010-11-25 20:12:28

1

正如其他人已经提到,信号处理会导致混乱(由于限制,特别是在多线程程序),所以最好是选择了另一种选择:

  • 要有处理专用线程通过sigwaitinfo发送信号 - 不过,坏消息是python似乎并不支持这种开箱即用的功能。

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

至于有没有必要在这里安装信号处理程序,对你可以做什么,当你被告知一个信号,它应该很容易完全关闭其他线程在你的程序没有限制。

2

处理此问题的最佳方法是根本不需要任何关机操作。例如,(例如)SIGTERM或SIGQUIT的信号处理程序可以调用_exit并退出进程而不进行清理。当一个线程调用_exit(或者如果你真的想退出时),其他线程也会被停止 - 无论他们在做什么。

这会很好,因为它实现了只有碰撞的设计。

服务器故障设计基于机器可能在任何时候都会发生故障的原理,所以您需要能够从这种故障中恢复,所以只需使其成为正常的退出方式即可。无论如何你都不需要额外的代码,因为你的服务器应该足够健壮。