1

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

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

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

execfile('myUnitTests.py')

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

myProcess.terminate()

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

サブプロセスをすぐに強制終了するように、プログラムの応答性を高めるにはどうすればよいですか?

4

1 に答える 1

2

Pythonのドキュメント[ http://docs.python.org/library/signal.html ]には次のように書かれています。

  • Pythonユーザーに関する限り、Pythonシグナルハンドラーは非同期的に呼び出されますが、Pythonインタープリターの「アトミック」命令間でのみ発生する可能性があります。これは、純粋にCで実装された長い計算中に到着する信号(大量のテキストでの正規表現の一致など)が任意の時間遅延する可能性があることを意味します。

したがって、5分間の単体テストが「純粋にCで実装された長い計算」を実行していて単体テストハーネスがのハンドラーをインストールしている場合SIGTERM、それが問題になります。myProcess.killその場合は、代わりに試してくださいmyProcess.terminate(または、2.6を持っていない場合はmyProcess.send_signal(9))。 SIGKILLユーザースペースからはキャッチできず、すぐに効果があります。

警告:単体テストフレームワークから出る途中で実行されるはずのクリーンアップアクションは実行されません。

于 2010-07-21T23:36:55.193 に答える