我想使用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()
也许有更简便的方式来处理它,而不是重复打开文件...
相关
for line in fifo
代替fifo.read()
。 - huggie