Linux 中的命名管道与 Python 读/写丢失了一些文本行

问题描述 投票:0回答:1

我正在学习如何使用命名管道在进程之间传递数据。为了测试它,我编写了两个 Python 脚本,分别称为

pipewriter.py
pipereader.py
,以及一个名为
my_pipe
(使用
mkfifo my_pipe
)的命名管道,它们都位于同一目录中。 Python 脚本包含在下面。

pipewriter.py

#!/usr/bin/env python3
for i in range(1, 5):
  with open('my_pipe', 'a') as outfile:
    outfile.write(f'Hello {i}\n')
    if i==4:
      outfile.write('\n')

print('Done')

pipereader.py

#!/usr/bin/env python3
while True:
  with open('my_pipe', 'r') as infile:
    input = infile.read()
    print(input,end="")

问题是

pipereader.py
有时会错过
pipewriter.py
输出的一些行。当我在一个终端中运行
./pipereader.py
并在另一个终端中运行
./pipewriter.py
时,写入的行是

Hello 1
Hello 2
Hello 3
Hello 4

但是如果我运行

./pipewriter.py; ./pipewriter.py; ./pipewriter.py
pipereader.py
在不同的终端中运行),那么
pipereader.py
的输出有时看起来像这样:

Hello 1
Hello 2
Hello 3
Hello 1    <- Missing "Hello 4"
Hello 2
Hello 3
Hello 4

Hello 1
Hello 2
Hello 3
Hello 4
  

我怎样才能找出线条消失的原因并确保它不会发生?

通过重写

./pipewriter.py
以每次执行仅打开
my_pipe
一次,我似乎可以防止丢失行。不过,我不确定这是否只是减少丢失线路的频率的问题,所以我只是“幸运”了几次测试它。

pipewriter.py
(已修改)

#!/usr/bin/env python3 
with open('my_pipe', 'a') as outfile:
  for i in range(1, 5):
    outfile.write(f'Hello {i}\n')
  outfile.write('\n')

print('Done')
python linux pipe named-pipes
1个回答
0
投票

请勿在

pipewriter.py
中反复打开和关闭管道。
infile.read()
会一直读取直到达到 EOF,这会在管道关闭时发生。如果
pipereader.py
infile.read()
中的循环完成之前调用
pipewriter.py
,则它不会读取所有内容。

在环路外打开管道。

with open('my_pipe', 'w') as outfile:
  for i in range(1, 5):
    outfile.write(f'Hello {i}\n')
  outfile.write('\n')
© www.soinside.com 2019 - 2024. All rights reserved.