単体テストを実行しているPythonサブプロセスをすぐに停止する方法は?勤務していない
-
26-09-2020 - |
質問
私は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
はユーザースペースから未確価で、即時効果を持つ必要があります。
警告:ユニットテストフレームワークから実行されている途中で実行されるクリーンアップアクションは実行されません。