単体テストを実行しているPythonサブプロセスをすぐに停止する方法は?勤務していない

StackOverflow https://stackoverflow.com/questions/3302910

質問

私は2つのスレッドを実行しているTkinter GUI、GUIのメイントレッドとワーカースレッドを持っています。ワーカースレッドは、次のコードを使用してサブプロセスを作成します。

myProcess = subprocess.Popen(['python', '-u', 'runTests.py'],  
                         stdout=subprocess.PIPE, 
                         stderr=subprocess.STDOUT)
.

ファイルruntests.pyはいくつかのセットアップを行い、次のコマンドを使用してユニットテストファイルを実行します。

execfile('myUnitTests.py')
.

ファイルmyunittests.pyには、5分以上実行するためにいくつかの単体テストがあります。 GUIからボタンをクリックしてテストの実行を停止します。これにより、ワーカースレッドがサブプロセスを停止するためのシグナルを送信させます。

myProcess.terminate()
.

terminateコマンドはすぐにプロセスを停止しません、現在の単位テストが実行されるまで待機してからプロセスを終了しますか? os.killを使用しようとしましたが、terminate()と同じ結果が得られます。

私のプログラムをより敏感にすることができるのは、サブプロセスをすぐに殺すようにプログラムをより敏感にすることができますか?

役に立ちましたか?

解決

Pythonのドキュメント[ http://docs.python.org/library/signal.html ]は言う:

  • Pythonユーザーが関係する限り、Python信号ハンドラは非同期的に呼ばれますが、Pythonインタプリタの「Atomic」命令の間にのみ発生することができます。これは、純粋にCで実装された長い計算中に到着する信号(例えば、テキストの大きな本体の正規表現の一致など)を任意の時間の間遅延させることができる。

だから5分のユニットテストを「純粋にC」で実装されている長い計算が行われている場合は、のユニットテストハーネスはSIGTERMのハンドラをインストールします。もしそうなら、myProcess.killの代わりにmyProcess.terminateを試してください(または2.6を持っていない場合は、myProcess.send_signal(9)を持っていない場合)。 SIGKILLはユーザースペースから未確価で、即時効果を持つ必要があります。

警告:ユニットテストフレームワークから実行されている途中で実行されるクリーンアップアクションは実行されません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top