2016-12-23 1 views
0

私はPythonプロジェクトで作業しています。私のスレッドではCと同じ動作が必要でした。 Cでは、メインスレッドが終了すると、他のすべてのスレッドが強制終了されます。Pythonでエラーが発生した場合は、すべてのスレッドを終了します

プロジェクトには、他のスレッドや他のソフトウェアからログを取得するために使用したTCPエラーサーバーが含まれています。TCPのリンクはシンプレックスです。 一部のエラーは、プログラム全体の終了を伴います。

  • 外部ソフトウェアの場合は、PIDを使用してそれらを強制終了できます。
  • 他のスレッドについては、sys._exit()を試しましたが、時々動作し、時にはスレッドが残ることもあります。

私の他のスレッドがループしていた場合は、semaphoreなどを使用できますが、リニアプロセスの1回の反復だけです。

私はデザインパターンProducer/Consumerについて考えていますが、lock.acquire()/lock.release()をたくさん追加しましたが、それは複雑さを増し、線形スレッドを壊すことを暗示していると思います。

私はこれらのソリューションを見つけた他のStackoverflow質問を見なければならなかった:

  • 使用sys._exit()をするが、その成功率は100%ではないです。
  • 私のスレッドをsubprocessに変換すると簡単に終了できますが、私の場合はできません。

解決策やデザインパターンなどを探しています。

PS:私はC愛好家で、私がPythonを扱うたびに、exit()と呼ぶだけで解決すると思います。

答えて

0

ワーカースレッドのデーモンスレッドを作成すると、デーモン以外のすべてのスレッド(メインスレッドなど)が終了したときに終了します。あなたが可能なキーボード割り込み信号(CTRL + C)上のスレッドを停止させるために

http://docs.python.org/library/threading.html#threading.Thread.daemon

スレッドのデーモンのステータスisDaemon()Falseで、setDaemon(True)

によってTrue別の解決策を、それを設定します終了する前に例外 "KeyboardInterrup"とクリーンアップをキャッチします。このように:

try: 
    start_thread() #And the rest of your main 
except (KeyboardInterrupt, SystemExit): 
    cleanup_stop_thread(); 
    sys.exit() 
+0

私はデーモニックとしてスレッドを設定しようとしましたが、動作しないか、リソースが解放されるのを待っていますが、どちらがわからないのでしょうか。 –

+0

とにかく、あなたのスレッドのstop_methodを作成することができます。メインでは、 'try .. except'を追加してキーボードの干渉を捕まえ、' stop_thread'メソッドを呼び出します。 – iFlo

+1

それは私がそれを試してみると素晴らしいですね。 –

関連する問題