以非阻塞方式读取并重新打开命名的PIPE

问题描述

在Linux上,使用Python 3.8,我试图逐行处理从命名管道(使用mkfifo创建)中读取的文本数据。读取发生在线程上(主线程运行asyncio事件循环)。

问题是,当发送数据的另一个进程未运行时,下面的代码会无限期地在open()处阻塞,但是当经过一定时间后,如果管道中没有数据,则需要停止线程时间量。

最初,我尝试使用select.select()之前,我意识到它在open()而不是readline()处阻塞。然后,我尝试使用signal.signal设置alarm,但是信令仅在主线程中起作用,这应该在线程池中运行。最好的办法是使open()以某种方式成为非阻塞状态,或者在open()之前也以非阻塞方式检测管道的另一半是否打开。

while True:
    with open(pipe_file_path,'r') as pipe_file:
        _log.debug("Reading log")
        while True:
            line = pipe_file.readline(768)
            if line == '':
                break
            process_line(line.rstrip()) # arbitrary processing
    _log.debug("Pipe closed")

整个过程处于无限循环中(第一行),因为我想在其他进程短暂关闭(有时会发生)时立即重新打开管道,例如在重新解析其配置时。因此,最终目标是:尝试在T时间内打开管道时读取管道,否则停止等待。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...