サブプロセスの呼び出しがほぼすぐに返されるはずですが、最終的にブロックされるという問題が発生しています (実際の子プロセスは機能せず、クリーンアップされていません)。これは、スレッドも使用している場合にのみ発生するようです。以下のプログラムは、私が見ているものをうまく再現しています。それを実行すると、ホスト名がブロックされるまで、範囲を循環する番号とともに何度も出力されることがわかります。スレッドが終了すると、機能していないプロセスがクリーンアップされ、再び発生すると思われます。
何が起こっているのか、そしてこれを起こさずにスレッドとサブプロセスの両方を使用するにはどうすればよいかについて、誰かが洞察を持っていますか? Ubuntu 11.4 で Python 2.7.1+ を使用しています。
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>