问题描述
在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 (将#修改为@)