我想使用os.mkfifo在程序之间进行简单的通信。我在循环中读取fifo有问题。
以这个玩具为例,我有一个读取器和一个作家在使用fifo。我希望能够在循环中运行读取器来读取进入fifo的所有内容。
# reader.py
import os
import atexit
FIFO = 'json.fifo'
@atexit.register
def cleanup():
try:
os.unlink(FIFO)
except:
pass
def main():
os.mkfifo(FIFO)
with open(FIFO) as fifo:
# for line in fifo: # closes after single reading
# for line in fifo.readlines(): # closes after single reading
while True:
line = fifo.read() # will return empty lines (non-blocking)
print repr(line)
main()作者:
# writer.py
import sys
FIFO = 'json.fifo'
def main():
with open(FIFO, 'a') as fifo:
fifo.write(sys.argv[1])
main()如果我运行python reader.py和以后的python writer.py foo,"foo“将被打印出来,但是fifo将被关闭,读取器将退出(或者在while循环中旋转)。我希望读者留在循环中,这样我就可以多次执行作者。
编辑
我使用这个片段来处理这个问题:
def read_fifo(filename):
while True:
with open(filename) as fifo:
yield fifo.read()但是也许有一些更整洁的方法来处理它,而不是重复打开文件.
相关
发布于 2013-07-03 13:46:55
FIFO就是这样工作的(在读者端):它可以被读到,直到所有的作者都走了。然后它向读者发送EOF信号。
如果你想让读者继续阅读,你将不得不再次打开并从那里阅读。所以你的片段就是该走的路了。
如果有多个编写器,则必须确保它们编写的每个数据部分都小于PIPE_BUF,这样才不会混淆消息。
发布于 2017-08-17 23:58:56
您不需要重复重新打开文件。您可以使用select阻止,直到数据可用为止。
with open(FIFO_PATH) as fifo:
while True:
select.select([fifo],[],[fifo])
data = fifo.read()
do_work(data)在本例中,您将不会阅读EOF。
https://stackoverflow.com/questions/17449110
复制相似问题