我有一些 Python 代码使用 threading.Timer 为操作实现 60 秒超时。
问题是这段代码在作业控制环境中运行,它可能会被更高优先级的作业抢占。在这种情况下,它将被发送 SIGSTOP,然后是一段时间后,SIGCONT。我需要一种方法来以某种方式注意到这已经发生并重置超时:显然,如果操作已暂停整个 60 秒,则该操作并没有真正超时。
我试图为 SIGCONT 添加一个信号处理程序,但这似乎是在提供给 threading.Timer 的代码执行后执行的。
有没有办法做到这一点?
我有一些 Python 代码使用 threading.Timer 为操作实现 60 秒超时。
问题是这段代码在作业控制环境中运行,它可能会被更高优先级的作业抢占。在这种情况下,它将被发送 SIGSTOP,然后是一段时间后,SIGCONT。我需要一种方法来以某种方式注意到这已经发生并重置超时:显然,如果操作已暂停整个 60 秒,则该操作并没有真正超时。
我试图为 SIGCONT 添加一个信号处理程序,但这似乎是在提供给 threading.Timer 的代码执行后执行的。
有没有办法做到这一点?
发布此消息后我想到的一个相当简单的答案是将计时器简单地分解为多个子计时器,例如有 10 个 6 秒计时器,而不是每个计时器启动链中的下一个计时器。这样,如果我被暂停,我只会丢失一个计时器,并且在超时之前仍然可以等待大部分时间。
这当然不是万无一失的,特别是如果我反复暂停和重新启动,但这很容易做到,而且似乎已经足够好了。
您需要重新考虑您的要求;超时反映经过的时间(墙上时间);您想知道您的流程使用的时间。
幸运的是,您可以使用以下方法进行测量getrusage:http ://docs.python.org/library/resource.html
您仍然需要设置超时;当它返回时,测量自操作开始以来用户或系统时间使用的增加,如果超过限制则终止操作,否则适当地重新安排超时时间。