我正在为Python编程类编写一个评分机器人,学生的提交可能无限循环。我想沙箱调用他们的程序,以便它不能运行超过特定的时间。我想跑,比方说,
restrict --msec=100 --default=-1 python -c "while True: pass"
如果程序运行时间超过100毫秒,则返回-1,否则返回已执行表达式的值(在本例中为python程序的输出)
Python内部是否支持此功能?我也在用Perl编写评分机器人,所以我可以使用一些Perl模块来包装对shell脚本的调用。
答案 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)
标准方法是执行以下操作。
创建一个子进程,在其自己的Python实例中运行学生的程序。
等一下。
如果学生子流程退出,那么好。
如果子进程尚未退出,则需要将其终止。
您最乐意下载psutil模块,该模块允许对子流程进行每次状态检查。