fifo - Lesen in einer Schleife
Möchte ich os.mkfifo für die einfache Kommunikation zwischen Programmen. Ich habe ein problem mit dem Auslesen aus der fifo in einer Schleife.
Betrachten Sie dieses Spielzeug Beispiel, wo ich eine reader und eine writer-arbeiten mit dem fifo. Ich möchte in der Lage zu laufen, den Leser in eine Schleife, um alles zu Lesen, das in den 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()
Und die Schriftsteller:
# writer.py
import sys
FIFO = 'json.fifo'
def main():
with open(FIFO, 'a') as fifo:
fifo.write(sys.argv[1])
main()
Wenn ich python reader.py
und später python writer.py foo
, "foo" wird gedruckt, aber der fifo wird geschlossen, und der Leser wird verlassen (oder spin im inneren des while
loop). Ich möchte die Leser in der Schleife bleiben, so kann ich das ausführen der Verfasser viele Male.
Bearbeiten
Ich dieses snippet zu behandeln Sie das Problem:
def read_fifo(filename):
while True:
with open(filename) as fifo:
yield fifo.read()
aber vielleicht gibt es etwas ordentlicher Weise, es zu handhaben, statt wiederholt öffnen der Datei...
Verwandte
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen FIFO funktioniert (auf der Leser-Seite) genau auf diese Weise: es kann gelesen werden, bis alle Autoren sind gegangen. Dann signalisiert es ein EOF-Zeichen an den Leser.
Wenn Sie möchten, dass die Leser weiterhin Lesen, müssen Sie wieder öffnen und Lesen von dort. Also das snippet ist genau der Weg zu gehen.
Wenn Sie mit mehreren Autoren, werden Sie haben, um sicherzustellen, dass jeder Datenteil geschrieben von Ihnen ist kleiner als
PIPE_BUF
auf, um nicht zu mischen, bis die Nachrichten.PIPE_BUF
die Ihnen sagt, wie groß die Daten packes werden kann, während nicht stören sich gegenseitig.Brauchen Sie nicht, öffnen Sie die Datei wiederholt. Sie können wählen, zu blockieren, bis die Daten zur Verfügung stellen.
In diesem Beispiel haben Sie nicht gelesen EOF.
for line in fifo
stattfifo.read()