如何在进程收到SIGSTOP和SIGCONT时处理超时?

时间:2012-06-11 15:28:28

标签: python multithreading

我有一些Python代码,它使用threading.Timer为操作实现60秒的超时。

问题在于,此代码在作业控制环境中运行,可能会被更高优先级的作业抢占。在这种情况下,它将被发送SIGSTOP,然后一段时间后,SIGCONT。我需要一种方法以某种方式注意到这已经发生并重置超时:显然,如果它在整个60秒内被暂停,那么操作并没有真正超时。

我尝试为SIGCONT添加一个信号处理程序,但这似乎在提供给threading.Timer的代码执行后执行。

有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:2)

发布此消息后发生的一个相当简单的答案就是将计时器分解为多个子计时器,例如:有10个6秒计时器而不是每个计时器开始链中的下一个计时器。这样,如果我被暂停,我只会失去一个计时器,并且在超时之前仍然可以获得大部分等待。

这当然不是万无一失的,特别是如果我多次被暂停和重新启动,但这很容易做,而且看起来可能已经足够了。

答案 1 :(得分:1)

你需要重新思考你所要求的东西;超时反映经过的时间(墙上时间);你想知道你的过程所用的时间。

幸运的是,您可以使用getrusagehttp://docs.python.org/library/resource.html

来衡量这一点

你仍然需要设置超时;当它返回时,测量自操作开始以来用户或系统时间使用量的增加,如果超过限制则终止操作,否则适当地重新安排超时。

答案 2 :(得分:0)

如果您的应用程序是多线程的,the docs说:

  

只有主线程可以设置一个新的信号处理程序,而主线程将是唯一一个接收信号的线程

确保您正在处理来自主线程的信号。