我有一个名为“timer\u fifo”的管道,python脚本的stdout被重定向到timer\u fifo,而并行的另一个shell脚本进程从中读取、处理它,然后将它重定向到另一个名为“activity\u file”的文件。你知道吗
Python脚本:
import time
while True:
print(time.strftime('%Y_%m_%d', time.gmtime()))
time.sleep(1)
执行上述python脚本:
python above_file_name > timer_fifo
Shell脚本:
while true
do
read action <timer_fifo;
echo $action | stdbuf -o0 -e0 -i0 sed -n "s/^\([^[:space:]].*\)/\1 Cinnamon/p" >> activity_file
done
注意:上面的sed命令附加了“cingalon”并重定向到活动文件,因此如果输入是“2017\u 02\u 01”,那么它将变为“2017\u 02\u 01 cingalon”,如果输入流以空格开头,它也会忽略输入流。你知道吗
正在执行上面的shell脚本:
./file_name
一段时间以来,文件的尾部:
2017_02_01 Cinnamon
2017_02_01 Cinnamon
2017_02_01 Cinnamon
2017_02_01 Cinnamon
2017_02_01 Cinnamon
2017_02_01 Cinnamon
2017_02_01 Cinnamon
但过了一会儿,文件的尾部:
2017_02_01 Cinnamon
2017_02_01 Cinnamon
2017_02_01 Cinnamon
2017_02_01 Cinnamon
017_02_01 Cinnamon
207_20 Cinnamon
270_1 Cinnamon
210_101_2001_20 Cinnamon
2017_02_0 Cinnamon
270_11207_02_01 Cinnamon
107_20 Cinnamon
0020 Cinnamon
如您所见,为什么输出会出错? 另外,我可能不止一次执行上述脚本,那么多个进程同时写入同一个文件会导致排序输出吗?如果是,请解释原因?你知道吗
如果只运行程序的一个副本,那么所有内容都会按顺序到达fifo,缓冲不会影响排序。你知道吗
如果您正在运行多个程序副本,并且每个副本都在执行自己的标准输出缓冲,那么您可能会得到部分行。你知道吗
我想这就是你看到的。你知道吗
我认为这种情况下(不完美的)解决方案是在python脚本的
print()
和sleep()
之间添加一行代码,如下所示:这将使得整条线路很可能在每次
print()
/flush()
被调用时,以单个、不间断的系统调用写入fifo。它仍然不能确定你是否得到原子性的保证。但实际上,像这样的短字符串将作为单个系统调用。你知道吗(您也可以尝试更改
sys.stdout
的缓冲区,或者使用python的运行时标志,但我认为如上所述调用flush()
是最好的方法。)fromsys.stdout docs:当交互时,标准流是行缓冲的。否则,它们像普通文本文件一样被块缓冲。你知道吗
相关问题 更多 >
编程相关推荐