当前位置: 首页 > 面试题库 >

Python读取名为PIPE

阎经武
2023-03-14
问题内容

我在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()正在返回一个空字符串,因为编写器已关闭其文件描述符。

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

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

会话示例

1号航站楼

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

2号航站楼

$ echo -n 'hello' > mypipe

1号航站楼

FIFO opened
Read: "hello"
Writer closed
$

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

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

通常,打开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程序员手册


 类似资料:
  • 我目前正在写一个代码,我需要读取给定文件的名称,并创建一个新的文件,只改变扩展名。我输入文件的方式是 我怎么能得到fileName并将其转换成字符串使用Java,我尝试了扫描仪和BufferedReader,但它只允许我读取内部文件,但不是fileName?

  • 问题内容: 这是我的问题:我在HDFS中有一个文件,该文件可能很大(=不足以容纳所有内存) 我想做的是避免必须将此文件缓存在内存中,而仅像逐行处理常规文件一样逐行处理它: 我正在寻找是否有一种简单的方法可以在不使用外部库的情况下正确完成此操作。我可能可以使它与libpyhdfs或python- hdfs一起使用, 但我想尽可能避免在系统中引入新的依赖项和未经测试的库,尤其是因为这两个似乎都没有得到

  • 本文向大家介绍python读取文件名称生成list的方法,包括了python读取文件名称生成list的方法的使用技巧和注意事项,需要的朋友参考一下 经常需要读取某个文件夹下所有的图像文件。 我使用python写了个简单的代码,读取某个文件夹下某个后缀的文件,将文件名生成为文本(csv格式) 上面代码保存为:GetLst.py 使用时: 在cmd窗口输入: 发现上面代码不能深入到下一层目录,又做了点

  • 主要内容:CSV文件读取,json读取文件,SQL数据库读取当使用 Pandas 做数据分析的时,需要读取事先准备好的数据集,这是做数据分析的第一步。Panda 提供了多种读取数据的方法: read_csv() 用于读取文本文件 read_json() 用于读取 json 文件 read_sql_query() 读取 sql 语句的, 本节将对上述方法做详细介绍。 CSV文件读取 CSV 又称逗号分隔值文件,是一种简单的文件格式,以特定的结构来排列表格数据

  • 本文向大家介绍详解python读取image,包括了详解python读取image的使用技巧和注意事项,需要的朋友参考一下 python 读取image 在python中我们有两个库可以处理图像文件,scipy和matplotlib. 安装库 用法 skimage 安装 pip install -U scikit-image PIL 安装 pip install pillow matplotlib

  • 我无法通过串行连接读取来自arduino的串行数据。为了解决串行和gui需要同时运行的问题,我使用了。函数后,每100ms调用一次更新序列。然而,当我运行这段代码时,没有弹出窗口,并且我得到一个错误,说我已经超过了最大递归深度。这是我的密码: