用于超时的Python信号不';t实际停止';It’时间太长了

用于超时的Python信号不';t实际停止';It’时间太长了,python,timeout,signals,sage,Python,Timeout,Signals,Sage,我想用Python(实际上是Sage,它是基于Python的)进行一些计算,但是如果它们花费的时间超过10秒,我想取消它们。在研究了如何使用超时后,我编写了以下代码: #!/my/path/to/sage import time, signal def handler(signum, frame): errortime = time.time() print str(errortime - starttime)[:7] raise Exception signal.

我想用Python(实际上是Sage,它是基于Python的)进行一些计算,但是如果它们花费的时间超过10秒,我想取消它们。在研究了如何使用超时后,我编写了以下代码:

#!/my/path/to/sage

import time, signal

def handler(signum, frame):
    errortime = time.time()
    print str(errortime - starttime)[:7]
    raise Exception

signal.signal(signal.SIGALRM, handler)
signal.alarm(10)

# Try to do some long computations with Sage
starttime = time.time()
try:
    F.<a> = NumberField(x^31 -5*x^7 +6*x^6 +2*x^5 +4*x^4 +x^3 -3*x^2 -2*x +1)
    result = F.pari_nf()
except Exception:
    print "exception occurred"
finally:
    print result
    signal.alarm(0)
(这确实需要花费大量的时间,这不仅仅是误判了所花的时间)

try
块中的计算通常需要18秒左右,但是
SIGALRM
信号不应该在10秒之后发出,然后记录
errortime
?此外,当遇到异常时,不是所有进行计算的尝试都应该停止吗


如果需要10秒以上的时间,我如何才能让这个Sage脚本真正停止并退出?

这无助于如何更可靠地执行此操作,但有关它不起作用的原因,请参阅您链接的文档,第三点:“在长时间计算过程中到达的信号仅在C。。。可能会延迟任意时间“@lvc:啊,谢谢你抓住了这一点-看起来这就是问题所在。另外,如果我使用Linux命令
timeout
,例如
timeout 10s./script.sage
,您是否会看到任何问题?就我在之后运行
top
所知,脚本不会继续运行,但我不知道是否还有其他更难注意到的副作用。即使C扩展没有将控件返回给Python解释器,也可以使用,例如,在C循环内调用
PyErr\u CheckSignals()
18.1582
exception occurred