阅读循环

我想使用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()

但也许有一些更好的方式来处理它,而不是重复打开文件...

有关

  • 让readline在FIFO上阻塞

  • 一个先进先出的工作原理(在读者一侧)就是这样的:它可以被读取,直到所有的作者都不在了。 然后它向读者发出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

    下一篇: see if radiobuttons or checkboxes are checked in IE8