2017-03-31 6 views
1

スレッドが実行を完了する前に、スレッドを使用して開始した長いプロセスのプロセスIDを返すにはどうすればよいですか?スレッドが実行を完了する前に、スレッドを使用して開始した長いプロセスのプロセスIDを返す方法

  1. 私はTkinter GUIを使用しているので、メインスレッドで長いプロセスを開始することはできません。代わりに別のスレッドで開始します。
  2. スレッドはsubprocess.popenを呼び出します。このプロセスは、5〜6時間かけて行う必要があります。
  3. 停止ボタンを押すと、このプロセスを停止する必要がありますが、subprocess.popenを使用して作成したプロセスのプロセスIDを返すことができません。

これには解決策はありますか?

+0

'' global var'に 'pid'を保存して、' process'を終了させる '' signal ''できるようにします。 – stovfl

+0

[Popenでプロセスを開いてPIDを取得する]の可能な複製(https://stackoverflow.com/questions/7989922/opening-a-process-with-popen-and-getting-the-pid) – ti7

答えて

0

subprocess.Popenを使用して別のプロセスをスピンオフする場合は、別のスレッドから行う必要はありません。このようにして作成されたサブプロセスは、メインスレッドをブロックしません。サブプロセスが実行されている間も、引き続き他の作業を行うことができます。 Popenオブジェクトへの参照を返すだけです。

Popenオブジェクトには、サブプロセスの監視/操作に必要なすべての機能があります。標準入出力に読み書きすることができます(PIPEで作成された場合、stdinstdoutのメンバーを介して)。 stdinstdoutselectモジュールを使用)の可読性/書き込み可能性を監視できます。サブプロセスがまだ存在していないかどうかをpollで確認し、終了ステータスをwaitにしてください。 terminate(またはあなたがどれくらい強くなっているかに応じてkill)で停止することができます。

ここでは他のスレッドからこれを行うことが有利な場合があります。たとえば、サブプロセスとの重要な相互作用が必要な場合やメインスレッドでの実装がロジックを複雑にする場合などです。その場合、他の「監視」スレッドにシャットダウンするタイミングを通知し、監視スレッドがサブプロセスでterminateまたはkillを実行できるようにするメカニズムを配置することが最善の方法です。

関連する問題