CentOSLinuxサーバーにPython2.7スクリプトがあり、サーバーにログインできなくなるまで新しいスレッドを開始するバグがありました。
この問題を防ぐために、Pythonランタイムに50を超えるスレッドを作成/開始/使用しないように(そして代わりに例外をスローするか、スクリプトを強制終了するように)指示する方法はありますか、またはこれをスクリプトに自分で実装する必要がありますか?
スレッドはを介して開始されthread.start_new_thread()
ます。
CentOSLinuxサーバーにPython2.7スクリプトがあり、サーバーにログインできなくなるまで新しいスレッドを開始するバグがありました。
この問題を防ぐために、Pythonランタイムに50を超えるスレッドを作成/開始/使用しないように(そして代わりに例外をスローするか、スクリプトを強制終了するように)指示する方法はありますか、またはこれをスクリプトに自分で実装する必要がありますか?
スレッドはを介して開始されthread.start_new_thread()
ます。
Pythonthreading
モジュール(新しいスレッドモジュール)のドキュメントによると、active_count()
モジュールのメソッドを呼び出して、実行されているスレッドの数を調べることができます。これで、下位レベルのモジュールを使用していることがわかりました。次のthread
コマンドを実行して調べました。
import thread
dir(thread)
これにより、リストが作成されました。
['LockType', '__doc__', '__name__', '__package__', '_count', '_local', 'allocate', 'allocate_lock', 'error', 'exit', 'exit_thread', 'get_ident', 'interrupt_main', 'stack_size', 'start_new', 'start_new_thread']
(特にインタラクティブ端末で、モジュールに含まれているものを見つけるのに非常に役立つため、これを示します)
thread
モジュールにフィールドが含まれていることがわかります_count
。このフィールドを呼び出すと(たとえばthread._count()
)、実行中のスレッドの数が返されます(この値を確認して、最大値を超えたときに例外を発生させることができます)。
もちろん、前の下線は_count
、メソッドがプライベートメソッドのように扱われることを意味します。ただし、Pythonでは引き続きアクセスできます。