gpt4 book ai didi

Python 读取名为 PIPE

转载 作者:IT王子 更新时间:2023-10-29 00:16:44 28 4
gpt4 key购买 nike

我在 linux 中有一个命名管道,我想从 python 中读取它。问题是 python 进程连续“消耗”一个核心 (100%)。我的代码如下:

FIFO = '/var/run/mypipe'
os.mkfifo(FIFO)
with open(FIFO) as fifo:
while True:
line = fifo.read()

我想问一下“ sleep ”是否会帮助解决这种情况,或者进程会丢失一些来自管道的输入数据。我无法控制输入,所以我不知道数据输入的频率。我阅读了有关 select 和 poll 的信息,但没有找到任何示例来解决我的问题。最后想问下100%使用率对数据输入有没有影响(丢失什么的?)。

编辑:我不想打破循环。我希望进程连续运行并“听到”来自管道的数据。

最佳答案

以典型的 UNIX 方式,read(2) 返回 0 字节以指示文件结束,这可能意味着:

  • 文件中没有更多的字节
  • 套接字的另一端关闭了连接
  • 作者关闭了管道

在您的例子中,fifo.read() 返回一个空字符串,因为编写器已关闭其文件描述符。

您应该检测到这种情况并跳出循环:

reader.py:

import os
import errno

FIFO = 'mypipe'

try:
os.mkfifo(FIFO)
except OSError as oe:
if oe.errno != errno.EEXIST:
raise

print("Opening FIFO...")
with open(FIFO) as fifo:
print("FIFO opened")
while True:
data = fifo.read()
if len(data) == 0:
print("Writer closed")
break
print('Read: "{0}"'.format(data))

示例 session

1 号航站楼:

$ python reader.py 
Opening FIFO...
<blocks>

2 号航站楼:

$ echo -n 'hello' > mypipe 

1 号航站楼:

FIFO opened
Read: "hello"
Writer closed
$

更新 1 - 持续重新打开

你表示你想继续监听管道上的写入,大概甚至在写入器关闭之后也是如此。

要有效地做到这一点,您可以(并且应该)利用以下事实:

Normally, opening the FIFO blocks until the other end is opened also.

在这里,我围绕 openread 循环添加了另一个循环。这样,一旦管道关闭,代码将尝试重新打开它,这将阻塞直到另一个编写器打开管道:

import os
import errno

FIFO = 'mypipe'

try:
os.mkfifo(FIFO)
except OSError as oe:
if oe.errno != errno.EEXIST:
raise

while True:
print("Opening FIFO...")
with open(FIFO) as fifo:
print("FIFO opened")
while True:
data = fifo.read()
if len(data) == 0:
print("Writer closed")
break
print('Read: "{0}"'.format(data))

1 号航站楼:

$ python reader.py 
Opening FIFO...
<blocks>

2 号航站楼:

$ echo -n 'hello' > mypipe 

1 号航站楼:

FIFO opened
Read: "hello"
Writer closed
Opening FIFO...
<blocks>

2 号航站楼:

$ echo -n 'hello' > mypipe 

1 号航站楼:

FIFO opened
Read: "hello"
Writer closed
Opening FIFO...
<blocks>

...等等。


您可以通过阅读管道的 man 页面了解更多信息:

关于Python 读取名为 PIPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39089776/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com