2016-07-08 14 views
2

私はスレッドに参加する目的を理解しています。リソースの使用について質問しています。ここでの具体的な使用例は、長時間実行しているスレッドが多数のスレッドを生成する必要があり、操作中に終了したかどうかを確認してから、それらをクリーンアップすることです。メインスレッドはinotifyイベントを待機し、それに基づいてスレッドを生成するので、inotify呼び出しでブロックする必要があるため、join()呼び出しをブロックできません。Pythonのスレッドは、漏れを防ぐために結合する必要がありますか?

私はpthreadsをして、例えば、終了したスレッドに参加しないことは、リソースリークが発生することを知っている:

でpthread_join(3):結合可能であるスレッドに参加するために失敗する(すなわち、ある1分離されない)、「ゾンビ糸」を生成する。各ゾンビスレッドがいくつかのシステムリソースを消費し、十分なゾンビスレッドが蓄積されたら、新しいスレッド(またはプロセス)を作成することはもはや不可能になるため、これを避けてください。

Pythonのドキュメントでは、このようなことは言及されていませんが、多くのスレッドが通常の操作中に結合されずに終了することが予想される場合、join()は問題なく無視できます。

私は単に私のスレッドリストを取得し、次の操作を行うことができます私は、思ったんだけど:各チェックについて

threads = [thread for thread in threads if thread.is_alive()] 

、またはこのリークはだろうか?または私は次のことをしなければならないのですか?

alive_threads = list() 
for thread in threads: 
    if thread.is_alive(): 
     alive_threads.append(thread) 
    else: 
     thread.join() 
threads = alive_threads 
+0

Pythonスレッドは、基盤となるシステムスレッドモデルの抽象レイヤーなので、[ソースコード](https://svn.python.org/projects/python/tags/r32/Lib/threading)をチェックするのが最善でしょう。 py)を使ってクリーンアップがすでに完了しているかどうかを確認します。 –

+0

ええ、ブロックだけではないように見えますが、将来のすべてのバージョンのPythonの安定した前提として、それに頼ることができるかどうかを知りたがっています。 – Taywee

答えて

0

TLDR:号

Thread.joinは単に端部にスレッドを待ち、それがクリーンアップを実行しません。基本的に、各Threadには、スレッドがクリーンアップされたときに解放されるロックがあります。 Thread.joinはロックが解除されるのを待つだけです。

いくつかのマイナークリーンアップが行われました。つまり、Thread.joinはロックを解除し、そのスレッドをデッドとしてマークするフラグを設定します。しかし、これらは内部的なものであり、ロックやフラグに依存する他のパブリックメソッドによっても実行されます。

関連する問題