0

我认为每个进程管道连接的工作都是异步的,但事实并非如此。

一个.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

以下代码以 2 秒为单位逐行显示。

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

但是以下代码完全显示了一次。

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

看起来壳管正在同步工作。我怎样才能异步进行?

4

2 回答 2

0

您可以使用线程,但我不知道这是否符合您的喜好。;)

ps:python中的线程非常简单,如果需要,我可以提供一个例子。

于 2013-05-15T09:42:44.573 回答
0

代码的问题在于,虽然表达式...

for line in sys.stdin:
    # ...

...被sys.stdin视为迭代器,在到达 EOF 之前它似乎不会产生任何值sys.stdin,就像sys.stdin.readlines().

对于第一种情况,它几乎立即到达 EOF,但在第二种情况下,它必须等待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 回答