Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 先进先出-循环读取_Python_Mkfifo - Fatal编程技术网

Python 先进先出-循环读取

Python 先进先出-循环读取,python,mkfifo,Python,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():

我想用于程序之间的简单通信。我在循环中读取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将关闭,读取器将退出(或在
循环期间在
内旋转)。我希望reader留在循环中,这样我就可以多次执行writer

编辑

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

def read_fifo(filename):
    while True:
        with open(filename) as fifo:
            yield fifo.read()
但也许有更简洁的方法来处理它,而不是重复打开文件

相关的

FIFO(在读卡器端)的工作方式正是这样:它可以从读卡器读取,直到所有写卡器都离开。然后它向读卡器发送EOF信号

如果你想让读者继续阅读,你必须再次打开并从那里阅读。因此,您的代码片段正是要走的路


如果您有多个写入器,您必须确保它们写入的每个数据部分都小于
PIPE\u BUF
,以免混淆消息。

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

with open(FIFO_PATH) as fifo:
    while True:
        select.select([fifo],[],[fifo])
        data = fifo.read()
        do_work(data)

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

我认为对于多个写入程序,我应该使用更奇特的东西,因为在这里,写入程序将彼此关闭FIFO?来自一个写入程序的数据可能与来自另一个写入程序的数据混合在一起。它们不会相互关闭,如果写入的数据足够小,它们也不会相互干扰。有一个常量
PIPE\u BUF
,它告诉您在不相互干扰的情况下,数据包可能会变得多大。我相信这是一个更好的答案,因为它不会消耗while循环的CPU周期。似乎如果编写器关闭,这将持续循环,在这种情况下,这会有所帮助:,或者对fifo中的行使用
,而不是
fifo.read()