1

プロセスを監視し、特定のパターンを待機しようとしています。たとえば、次のようにします。

open someFile id=123

その後、私は待ちたい

close id=123

次のようにスクリプトを記述しようとしました。

running_procs = [Popen(["process", "and", "options"], stdout=PIPE, stderr=PIPE)]

while running_procs:
    for proc in running_procs:
        retcode = proc.poll()
        if retcode is not None: # Process finished.
            running_procs.remove(proc)
            break
        else:
            while True:
                next_line = proc.stdout.readline()
                if next_line == '' and proc.poll() != None:
                    break
                m = re.search( r'someFile.*id\=([0-9]*)', next_line, re.M|re.I)
                if m:
                  print m.group(1)

しかし、パフォーマンスが遅すぎるようです。パイプ内の多くの行を処理するための提案はありますか? もっと速い方法はありますか?

4

1 に答える 1

3

この特定の例には、単にコードが原因で遅くなる必要があることを示すものは何もありません。リストにプロセスが 1 つしかない場合、プロセスが利用可能になるのと同じ速さで行を読み取ります。これは、サブプロセスが出力をフラッシュして行を使用可能にすることにコードが依存することを意味します。しかし、それは本当に予想されることです。

常に行ごとに読み取ることになるbufsize=1ため、Popen に設定して、常に行がバッファリングされるようにすることをお勧めします。

Popen(["process"], stdout=PIPE, stderr=PIPE, bufsize=1)

ただし、可能性のあるプロセスのリストを使用し、それらから死んだプロセスをポップしているという事実によって示されるように、複数のプロセスを実行する場合は問題が発生します。ループは一度に 1 つのプロセスでブロックされます。これがプロセスを連続して読み取る意図がない場合は、データを取り戻す方法が遅くなる原因になります。それらは並行して実行されますが、監視されるのはシリアルにのみです。

これとは別に、結果が遅いと考える理由と、何が起こると予想されるかについて、より詳細に説明する必要があります。

于 2012-06-27T01:09:09.017 に答える