2012-02-26 3 views
2

저는 Python 프로그래밍 클래스를위한 채점 로봇을 작성 중이며 학생들의 제출이 무한 루프 될 수 있습니다. 특정 시간보다 오래 실행될 수 없도록 프로그램에 대한 쉘 호출을 샌드 박스에 넣고 싶습니다. 나는, 말,시간에 따른 샌드 박스 쉘 프로그램

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

을 실행하는 데 좋아하고 -1을 반환 프로그램이 더 이상이 100ms 이상 실행하는 경우가 있고, 그렇지 않으면,이 경우에 (파이썬 프로그램의 출력을 실행 식의 값을 반환 할 것)

파이썬은 이것을 내부적으로 지원합니까? 나는 Perl에 등급 로봇을 쓰고 있는데, 그래서 쉘 스크립트에 대한 호출을 감싸는 Perl 모듈을 사용할 수있다.

답변

3

apply_async을 사용하여 학생의 기능을 호출하십시오 (아래 예에서 foo). 학생이 기능을 대신하는 스크립트를 제출하는 경우 다음 jcollado's Command class을 사용할 수,

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) 

또는 그렇지 않으면 get가 TimeoutError 인상, 그것은 0.1 초 이내에 반환하는 경우 결과를 얻기 위해 타임 아웃으로 get method를 사용합니다.

+0

파이썬에 대해 알아두면 좋지만, 파이썬 오버 헤드없이 모든 일을 처리 할 수있는 스크립트를 사용하게되었습니다. http://www.pixelbeat.org/scripts/timeout – JeremyKun

0

표준 접근법은 다음을 수행하는 것입니다.

  1. 학생 프로그램을 자신의 파이썬 인스턴스에서 실행하는 하위 프로세스를 만듭니다.

  2. 잠시 기다려주십시오.

  3. 학생용 하위 프로세스가 종료되면 양호합니다.

  4. 하위 프로세스가 종료되지 않은 경우 종료해야합니다.

당신은 서브 프로세스의 각 상태 검사를 허용하는 psutil 모듈을 다운로드 행복한 수 있습니다.