2012-07-11 27 views
6

私は次のコードを使用してスレッドを開始します。どのように私はPythonのスレッドを殺すことができます

t = thread.start_new_thread(myfunction) 

スレッドtを別のスレッドから削除するにはどうすればよいですか。基本的にはコードの点で言えば、私はこのようなことをしたいと思っています。

t.kill() 

私はPython 2.4を使用しています。

+0

ハイレベル*スレッディング*ライブラリの代わりに低レベル*スレッド*モジュールを使用している理由を聞かせてもよろしいですか? –

答えて

10

あなたのスレッドがPythonコードを実行中にビジー状態になっている場合は、それを強制終了できない場合よりも大きな問題があります。 GILは、他のスレッドが殺害を行うために使用する命令を実行していないようにします。 (ちょっとした研究の後、私は通訳が定期的にGILをリリースすることを知りましたので、前の文は偽です)。

あなたのスレッドは協調的な方法で書く必要があります。つまり、定期的にセマフォなどのシグナリングオブジェクトでチェックインする必要があります。セマフォは、メインスレッドがワーカースレッドに自発的に終了するよう指示するために使用できます。

while not sema.acquire(False): 
    # Do a small portion of work… 

か:

for item in work: 
    # Keep working… 
     # Somewhere deep in the bowels… 
     if sema.acquire(False): 
      thread.exit() 
+0

その 'sema'を取得するには? –

+0

https://docs.python.org/2/library/threading.html#semaphore-objects –

+1

スレッドがraw_input()を待機しています....:S – ntg

7

他のスレッドからスレッドを削除することはできません。終了するはずの別のスレッドに信号を送る必要があります。そして、「信号」によって、私はsignal機能を使用するわけではありません。つまり、スレッド間の通信を手配しなければならないということです。

+2

ポイントは、私が殺したいスレッドが関数内でビジー状態になる可能性があり、それがあまりにも忙しくなった(突っ込んだ、停止した)場合、突然終了させたいということです。 – pythonic

+1

スレッドがハングしたり停止したりすることがないようにスレッドを作成する方が良いでしょうか?通常は、ある種のmutex/sempahore/flagを使ってスレッドに信号を送り、ループから落ちるようにします。 – DipSwitch

+1

スレッドのタイムアウトと、そのタイムアウト割り込みを捕捉するシグナルハンドラを使用します。 – bos

14

Pythonでは、あなたは、単にスレッドを殺すことはできません。

あなたは本当にスレッドを持っている必要がない場合は(!)、あなたは何ができるかは、代わりにスレッドパッケージ(http://docs.python.org/2/library/threading.html)を使用しての、マルチプロセッシングパッケージ(http://docs.python.org/2/library/multiprocessing.html)を使用することです。ここでは、プロセスを殺すために、あなたは、単にメソッドを呼び出すことができます。

yourProcess.terminate() # kill the process! 

Pythonは(、UnixではSIGTERMシグナルている間、Windows上のTerminateProcessから()の呼び出しを)あなたのプロセスを強制終了します。キューやパイプを使用しているときに注意してください! (それが破損する可能性がありキュー/パイプ内のデータ)

なおmultiprocessing.Eventthreading.Eventのと同じ方法で正確にmultiprocessing.Semaphore作業とthreading.Semaphoreそれぞれ。実際、最初のものは、ラターのクローンです。

スレッドを本当に使用する必要がある場合は、直接スレッドを強制終了する方法はありません。しかし、できることは"デーモンスレッド"を使用することです。何も生きている非デーモンスレッドが残っていないとき、メインプログラムは終了します

yourThread.daemon = True # set the Thread as a "daemon thread" 

:実際には、Pythonで、スレッドはデーモンとしてフラグを設定することができます。つまり、メインスレッド(もちろんデーモン以外のスレッド)が処理を終了すると、デーモンスレッドがまだ動作していてもプログラムは終了します。開始前デーモンとしてスレッドを設定することが必要であることを

注()メソッドが呼び出されました!

することができます。もちろん、

、および、マルチプロセッシングでもデーモンを使用する必要があります。ここで、メインプロセスが終了すると、デーモンのすべての子プロセスが終了しようとします。

最後に、sys.exit()os.kill()が選択肢ではないことに注意してください。

+0

スレッドとマルチプロセッシングを明確にするために、http://stackoverflow.com/questions/18114285/python-what-are-the-differences-between-the-threading-and-multiprocessing-modul –

+0

私はこの答えが好きです....スレッドの性質上の平凡な古い真実です... – repzero

関連する問題