2012-01-29 13 views
2

すぐに戻るべきサブプロセス呼び出しがブロックする(実際の子プロセスは無効であり、クリーンアップされない)という問題が発生します。これはスレッドを使用している場合にのみ発生します。以下のプログラムは、私が見ているものをうまく再現しています。それを実行すると、ブロックされるまで、範囲を循環する番号でホスト名が表示されます。私は、スレッドが終了すると、無効なプロセスがクリーンアップされ、その後再び発生すると考えられます。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> 
+1

自分自身でスレッドボンシングをすると、おそらくあなたがしようとしていることに悪い考えです... – Amber

+0

合意しました - 私のプロジェクトでは、最大4つのスレッドしか起動しません。しかし、上記は同じ挙動を再現する。たぶん私は資源や何かを使い果たしているのだろうか? – evan

+0

例を更新して、限られた数のスレッドを起動し、それでも問題が発生するかどうかを確認できますか。 –

答えて

2

を私は、Python 2.7(Ubuntuの12.04(のpython 2.7.3)に10.8 OS X上でこの問題を再現。 2)。

subprocess.Popenおよびsubprocess.check_callの呼び出しでclose_fds = Trueを設定すると、問題は解決しません。

私はこれが何を意味するかはわかりませんが、もう少し知識を持っている人が質問に完全に回答するのに役立つかもしれません。

関連する問題