すぐに戻るべきサブプロセス呼び出しがブロックする(実際の子プロセスは無効であり、クリーンアップされない)という問題が発生します。これはスレッドを使用している場合にのみ発生します。以下のプログラムは、私が見ているものをうまく再現しています。それを実行すると、ブロックされるまで、範囲を循環する番号でホスト名が表示されます。私は、スレッドが終了すると、無効なプロセスがクリーンアップされ、その後再び発生すると考えられます。thread.start()が実行されたときにサブプロセスが無効になる
何が起こっているのかについての洞察はありますが、これは起こらずにスレッドとサブプロセスの両方をどのように使用できますか?私はUbuntu 11.4でPython 2.7.1+を使用しています。 defuctになってきて、メインスレッドブロックし、これはサブプロセスになり実行
import os
import subprocess
import threading
class DummyThread(threading.Thread):
def run(self):
proc = subprocess.Popen(['sleep', '100'])
proc.wait()
while True:
dummy = DummyThread()
dummy.start()
for i in range(10):
print i
subprocess.check_call(['hostname'])
:
user 28665 10543 1 22:55 pts/2 python blocker.py
user 28667 28665 0 22:55 pts/2 sleep 100
user 28679 28665 0 22:55 pts/2 sleep 100
user 28691 28665 0 22:55 pts/2 sleep 100
user 28703 28665 0 22:55 pts/2 sleep 100
user 28715 28665 0 22:55 pts/2 sleep 100
user 28727 28665 0 22:55 pts/2 sleep 100
user 28739 28665 0 22:55 pts/2 sleep 100
user 28751 28665 0 22:55 pts/2 sleep 100
user 28763 28665 0 22:55 pts/2 sleep 100
user 28775 28665 0 22:55 pts/2 sleep 100
user 28787 28665 0 22:55 pts/2 sleep 100
user 28799 28665 0 22:55 pts/2 sleep 100
user 28800 28665 0 22:55 pts/2 [hostname] <defunct>
自分自身でスレッドボンシングをすると、おそらくあなたがしようとしていることに悪い考えです... – Amber
合意しました - 私のプロジェクトでは、最大4つのスレッドしか起動しません。しかし、上記は同じ挙動を再現する。たぶん私は資源や何かを使い果たしているのだろうか? – evan
例を更新して、限られた数のスレッドを起動し、それでも問題が発生するかどうかを確認できますか。 –