这是我的情况:
我有一个程序生成器,它可以生成大量随机程序(这些程序在单个线程上运行,因此没有任何花哨的东西)。我需要针对一些测试用例快速检查它们是否正确。
但是,由于这些程序是随机的,它们可能是格式错误并且包含无限循环,所以我需要一个超时机制来超时并快速地使这些坏程序失败,以便继续测试下一个程序。
我在这篇文章中使用了timeout.py装饰器: How to timeout function in python, timeout less than a second
我遇到了这个拒绝超时的特殊程序的问题,这是一个脚本:
from timeout import *
@timeout(0.1)
def f ( x0 ) :
x1 = [ ]
x2 = [ 0.0 ]
while x1 < x2 :
if x1 == 0 :
x3 [ 0 ] = 0.0
elif x1 == 1 :
x3 . append ( x0 [ x1 ] )
else :
for x2 in range ( 1 , len ( x0 ) ) :
x3 . append ( x0 [ x1 ] * ( x1 - 1 ) )
x1 = x1 + 1
return x3
f([1,2,3,4,5])
我不知道发生了什么,但似乎该程序陷入了对超时信号机制没有反应的过程的某些部分。
我发现了一个非常奇怪的手动解决办法,让这个特定程序超时:
@timeout(0.1)
def f1 ( x0 ) :
print "1"
x1 = [ ]
print "2"
x2 = [ 0.0 ]
print "3"
while x1 < x2 :
print "4"
if x1 == 0 :
print "5"
x3 [ 0 ] = 0.0
print "6"
elif x1 == 1 :
print "7"
x3 . append ( x0 [ x1 ] )
print "8"
else :
print "9"
for x2 in range ( 1 , len ( x0 ) ) :
print "10"
x3 . append ( x0 [ x1 ] * ( x1 - 1 ) )
print "11"
x1 = x1 + 1
print "12"
return x3
同样,我不确定为什么print语句强制它正确超时,但是手动插入这些print语句是不切实际的,编辑程序的字符串形式或程序的AST太麻烦了。插入这些打印只是为了超时。
总之,鉴于我需要使用超时快速测试这些程序,最佳解决方案是什么?提前谢谢。
我正在运行ubuntu 14.04(据我所知,这些信号是系统特定的)