2

サブプロセスの呼び出しがほぼすぐに返されるはずですが、最終的にブロックされるという問題が発生しています (実際の子プロセスは機能せず、クリーンアップされていません)。これは、スレッドも使用している場合にのみ発生するようです。以下のプログラムは、私が見ているものをうまく再現しています。それを実行すると、ホスト名がブロックされるまで、範囲を循環する番号とともに何度も出力されることがわかります。スレッドが終了すると、機能していないプロセスがクリーンアップされ、再び発生すると思われます。

何が起こっているのか、そしてこれを起こさずにスレッドとサブプロセスの両方を使用するにはどうすればよいかについて、誰かが洞察を持っていますか? 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>
4

1 に答える 1

2

この問題を ubuntu 12.04 (python 2.7.3) と OS X 10.8 (python 2.7.2) で再現しました。

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

これが何を意味するのかはわかりませんが、もう少し知識のある人が質問に完全に答えるのに役立つかもしれません.

于 2012-10-29T22:55:48.267 に答える