Python读取名为PIPE

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

FIFO = '/var/run/mypipe'

os.mkfifo(FIFO)

with open(FIFO) as fifo:

while True:

line = fifo.read()

我想问一下“睡眠”是否会帮助这种情况,或者该过程将丢失管道中的某些输入数据。我无法控制输入,所以我不知道数据输入的频率。我阅读了有关选择和民意调查的信息,但没有找到解决此问题的任何示例。最后,我想问一下100%的使用率是否会对数据输入产生任何影响(损失或其他原因?)。

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

回答:

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

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

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

您应该检测到这种情况并打破循环:

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))

1号航站楼

$ python reader.py 

Opening FIFO...

<blocks>

2号航站楼

$ echo -n 'hello' > mypipe

1号航站楼

FIFO opened

Read: "hello"

Writer closed

$


更新1-不断重新打开

您指出您想继续监听管道上的写入,即使在关闭写入器之后也是如此。

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

通常,打开FIFO块,直到另一端也打开。

在这里,我周围添加另一个循环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有关管道的页面来了解更多信息:

  • PIPE(7)-Linux程序员手册
  • FIFO(7)-Linux程序员手册

以上是 Python读取名为PIPE 的全部内容, 来源链接: utcz.com/qa/402520.html

回到顶部