Sandbox shell程序准时

时间:2012-02-26 18:42:16

标签: python shell sandbox

我正在为Python编程类编写一个评分机器人,学生的提交可能无限循环。我想沙箱调用他们的程序,以便它不能运行超过特定的时间。我想跑,比方说,

restrict --msec=100 --default=-1 python -c "while True: pass"

如果程序运行时间超过100毫秒,则返回-1,否则返回已执行表达式的值(在本例中为python程序的输出)

Python内部是否支持此功能?我也在用Perl编写评分机器人,所以我可以使用一些Perl模块来包装对shell脚本的调用。

2 个答案:

答案 0 :(得分:3)

使用apply_async来调用学生的功能,(以下示例中为foo)。如果在0.1秒或更短时间内返回结果,则使用带有超时的get method获取结果,否则get引发TimeoutError:

import multiprocessing as mp
import time
import sys

def foo(x):
    time.sleep(x)
    return x*x

pool = mp.Pool(1)

for x in (0.01, 1.0):
    try:
        result = pool.apply_async(foo, args = (x,)).get(timeout = 0.1)
    except KeyboardInterrupt:
        pool.terminate()
        sys.exit("Cancelled")
    except mp.TimeoutError:
        print('Timed out')
    else:
        print "Result: {r}".format(r = result)

或者,如果学生提交脚本而不是功能,那么您可以使用jcollado's Command class

答案 1 :(得分:0)

标准方法是执行以下操作。

  1. 创建一个子进程,在其自己的Python实例中运行学生的程序。

  2. 等一下。

  3. 如果学生子流程退出,那么好。

  4. 如果子进程尚未退出,则需要将其终止。

  5. 您最乐意下载psutil模块,该模块允许对子流程进行每次状态检查。