一尘不染

关闭缓冲

linux

接下来的缓冲区在哪里…以及如何将其关闭?

我正在像这样的python程序中写出到stdout:

for line in sys.stdin:
    print line

这里有一些缓冲:

tail -f data.txt | grep -e APL | python -u Interpret.py

我尝试了以下方法来摆脱可能的缓冲…但是没有运气:

  • 如上使用-u标志和python调用
  • 在每次sys.stdout.write()调用之后调用sys.stdout.flush()…所有这些都创建了一个带有python的缓冲流,等待一分钟左右以打印出前几行。
  • 使用以下修改的命令:

stdbuf -o0 tail -f data.txt | stdbuf -o0 -i0 grep -e APL | stdbuf -i0 -o0
python -u Interpret.py

为了确定我的期望,我尝试:

tail -f data.txt | grep -e APL

这会产生稳定的线流……肯定不会像python命令那样缓冲。

那么,如何关闭缓冲?解答:事实证明,管道的两端都有缓冲。


阅读 315

收藏
2020-06-07

共1个答案

一尘不染

我认为问题在于grep缓冲其输出。当您管道操作时,它就是这样做的tail -f | grep ... | some_other_prog。要grep每行刷新一次,请使用以下--line-buffered选项:

% tail -f data.txt | grep -e APL --line-buffered | test.py
APL

APL

APL

在哪里test.py

import sys
for line in sys.stdin:
    print(line)

(已在gnome-terminal的Linux上进行了测试。)

2020-06-07