首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fifo -循环读取

fifo -循环读取
EN

Stack Overflow用户
提问于 2013-07-03 13:18:24
回答 2查看 21.6K关注 0票数 13

我想使用os.mkfifo在程序之间进行简单的通信。我在循环中读取fifo有问题。

以这个玩具为例,我有一个读取器和一个作家在使用fifo。我希望能够在循环中运行读取器来读取进入fifo的所有内容。

代码语言:javascript
复制
# 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()

作者:

代码语言:javascript
复制
# 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循环中旋转)。我希望读者留在循环中,这样我就可以多次执行作者。

编辑

我使用这个片段来处理这个问题:

代码语言:javascript
复制
def read_fifo(filename):
    while True:
        with open(filename) as fifo:
            yield fifo.read()

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

相关

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-03 13:46:55

FIFO就是这样工作的(在读者端):它可以被读到,直到所有的作者都走了。然后它向读者发送EOF信号。

如果你想让读者继续阅读,你将不得不再次打开并从那里阅读。所以你的片段就是该走的路了。

如果有多个编写器,则必须确保它们编写的每个数据部分都小于PIPE_BUF,这样才不会混淆消息。

票数 5
EN

Stack Overflow用户

发布于 2017-08-17 23:58:56

您不需要重复重新打开文件。您可以使用select阻止,直到数据可用为止。

代码语言:javascript
复制
with open(FIFO_PATH) as fifo:
    while True:
        select.select([fifo],[],[fifo])
        data = fifo.read()
        do_work(data)

在本例中,您将不会阅读EOF。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17449110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档