0

各プロセスのパイプ接続は非同期で動作すると思っていましたが、そうではありません。

a.py

#!/usr/bin/env python
import sys
import time
for line in sys.stdin:
    time.sleep(2)
    sys.stdout.write(line.upper())
    sys.stdout.flush()

と b.py

#!/usr/bin/env python
import sys
for line in sys.stdin:
    sys.stdout.write(line.capitalize())
    sys.stdout.flush()

およびtest.txt

hello
world
python

次のコードは、各行を 1 行ずつ 2 秒ずつ表示します。

$ ./a.py < test.txt
HELLO
WORLD
PYTHON

ただし、次のコードは完全に一度だけ表示されます。

$ ./a.py < test.txt | ./b.py
Hello
World
Python

シェルパイプが同期して動作しているようです。どうすれば非同期にできますか?

4

2 に答える 2

0

コードの問題は、式が...

for line in sys.stdin:
    # ...

sys.stdin...イテレータとして扱っていsys.stdinますsys.stdin.readlines()

最初のケースでは、ほとんどすぐに EOF に達しますが、2 番目のケースでは、a.py終了するまで待機する必要があり、6 秒かかります。

このようにコードを書き直す必要がありますb.py...

#!/usr/bin/env python
import sys
while 1:
    line = sys.stdin.readline()
    if not line:
        break
    sys.stdout.write(line.capitalize())
    sys.stdout.flush()

... readline()EOF を待つのではなく、行全体があるとすぐに呼び出しを返すために使用します。

a.pyテキスト ファイル以外からの入力をパイプ処理する場合にも、同様の変更を行う必要があります。

于 2013-05-15T11:23:43.620 に答える
0

スレッドを使用することもできますが、これが好みに合うかどうかはわかりません。;)

Ps: Python のスレッドは非常に簡単です。必要に応じて例を提供できます。

于 2013-05-15T09:42:44.573 に答える