2012-03-05 2 views
1

2秒後にpython(rpy2)から呼び出されたR関数の実行を停止したい。ここにPythonコード:Python(rpy2)で実行しているRコードの時間制限をどのように設定できますか?

signal.signal(signal.SIGALRM, handler) 
signal.alarm(2) # set timeout to 2 seconds 

# run R code 
result = robjects.r(''' 
     Sys.sleep(10) 
     return("hello") 
    ''') 

signal.alarm(0) # disable alarm 

これは機能しません。私は信号ハンドラのために10秒待たなければなりません。

+0

それは人々が正確に知るのを助けるかもしれません_how_は動作しません。エラー? 10秒間の一時停止要求を無視するだけですか? – joran

+0

一時停止要求を10秒間無視するだけです。 PythonはRコードの実行時間については何も知らず、robjectsで5回実行します。シグナルは_handler_メソッドと呼ばれますが、10秒後ではなく2秒後に消えます。 – user1250280

答えて

1

Rコードの評価では、Python GILはリリースされません。 Rコードの実行時間を監視するPythonスクリプトを取得する唯一の方法は、2つのプロセスを持つことです。

rpy2 "testInterruptR()"の単体テストを確認することができますが、アプリケーションでそれを実装する方がはるかに洗練された方法があります。 SIGINTは、無限ループを実行しているRプロセスに送られます。

+0

ありがとうございます(私は「投票アップ」をクリックすることはできません)。 – user1250280

1

アラームを設定してから、タイムアウトしたい操作をtry catchブロックの内側に入れてみてください。アラームはキャッチ可能な例外をスローするはずです。とにかくそれは私にとってはうまくいくと思う。

関連する問題