单线程python程序超时

时间:2016-03-21 08:43:36

标签: python

这是我的情况:

我有一个程序生成器,它可以生成大量随机程序(这些程序在单个线程上运行,因此没有任何花哨的东西)。我需要针对一些测试用例快速检查它们是否正确。

但是,由于这些程序是随机的,它们可能是格式错误并且包含无限循环,所以我需要一个超时机制来超时并快速地使这些坏程序失败,以便继续测试下一个程序。

我在这篇文章中使用了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(据我所知,这些信号是系统特定的)

0 个答案:

没有答案