阅读循环
我想使用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()
但也许有一些更好的方式来处理它,而不是重复打开文件...
有关
一个先进先出的工作原理(在读者一侧)就是这样的:它可以被读取,直到所有的作者都不在了。 然后它向读者发出EOF信号。
如果你想让读者继续阅读,你必须再次打开并阅读。 所以你的片段就是要走的路。
如果您有多个写入器,则必须确保由它们写入的每个数据部分都小于PIPE_BUF
,以免混淆消息。
您不需要重复打开文件。 您可以使用select来阻塞,直到数据可用。
with open(FIFO_PATH) as fifo:
while True:
select.select([fifo],[],[fifo])
data = fifo.read()
do_work(data)
在这个例子中,你不会阅读EOF。
链接地址: http://www.djcxy.com/p/14583.html上一篇: reading in a loop