2012-02-26 2 views
2

私はPythonプログラミングクラスのための格付けロボットを書いています、そして、学生の提出は無限ループするかもしれません。私はそのプログラムにシェル呼び出しをサンドボックスして、特定の時間より長く実行できないようにしたい。私は、たとえば、時間のサンドボックスシェルプログラム

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

を実行したいと、それは-1を返し、プログラムが長く100msのより稼働している場合があり、そうでない場合は、この場合には(Pythonのプログラムの出力を実行し、式の値を返したいです)

これは内部的にサポートしていますか?私はPerlに格付けロボットも書いているので、シェルスクリプトの呼び出しを包み込んだPerlモジュールを使うことができます。

答えて

3

apply_asyncを使用して、学生の機能(以下の例ではfoo)を呼び出します。

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を使用することができます。それ以外の場合はgetはTimeoutErrorを上げ、それが0.1秒以内に返された場合の結果を得るために、タイムアウトでget methodを使用してください。

+0

Pythonについて知っておいてよかったですが、私はすべてのPythonオーバーヘッドがなくても何かできるスクリプトを使いました:http://www.pixelbeat.org/scripts/timeout – JeremyKun

0

標準的な方法は、以下を実行することです。

  1. 生徒のプログラムを独自のPythonインスタンスで実行するサブプロセスを作成します。

  2. しばらくお待ちください。

  3. 生徒のサブプロセスが終了した場合は、良好です。

  4. サブプロセスが終了していない場合は、それを強制終了する必要があります。

あなたは、サブプロセスの各ステータスのチェックを可能にpsutilモジュールをダウンロードする最も幸せなことでしょう。