用于超时的Python信号不';t实际停止';It’时间太长了
我想用Python(实际上是Sage,它是基于Python的)进行一些计算,但是如果它们花费的时间超过10秒,我想取消它们。在研究了如何使用超时后,我编写了以下代码:用于超时的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.
#!/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