我正在学习如何使用命名管道在进程之间传递数据。为了测试它,我编写了两个 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')
请勿在
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')