3

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

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

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

有没有办法做到这一点?

4

3 回答 3

2

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

这当然不是万无一失的,特别是如果我反复暂停和重新启动,但这很容易做到,而且似乎已经足够好了。

于 2012-06-12T06:35:16.750 回答
1

您需要重新考虑您的要求;超时反映经过的时间(墙上时间);您想知道您的流程使用的时间。

幸运的是,您可以使用以下方法进行测量getrusagehttp ://docs.python.org/library/resource.html

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

于 2012-06-11T15:58:13.743 回答
0

如果您的应用程序是多线程的,则文档说:

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

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

于 2012-06-11T17:00:06.140 回答