Re: [Python-de] Zeilengepuffertes r/w
TOFU repariert. http://de.wikipedia.org/wiki/TOFU Jens Diemer <python_gmane@jensdiemer.de> writes:
Am 30.08.2011 13:53, schrieb Ole Streicher:
wie bekomme ich eine zeilengepufferte Kommunikation zwischen zwei Scripten hin? Ich habe folgende zwei Mini-Programme:
Sender: ----------------------8<----------------- import time l = open('myfifo',mode='w',buffering=1) [...] ----------------------8<-----------------
Empfänger: ----------------------8<----------------- l = open('myfifo', buffering=1) [...] ----------------------8<-----------------
Was ist mit l.flush() ?
Es ist nicht die Sender-Seite, die das Problem macht, sondern der Empfänger. Ersetzt man den Empfänger durch "cat myfifo", kommen die Zeilen sofort. Wo sollte man denn beim Empfänger das l.flush() hinsetzen? Ole
Am 30.08.2011 15:28, schrieb Ole Streicher:
TOFU repariert.
http://de.wikipedia.org/wiki/TOFU
Jens Diemer <python_gmane@jensdiemer.de> writes:
Am 30.08.2011 13:53, schrieb Ole Streicher:
wie bekomme ich eine zeilengepufferte Kommunikation zwischen zwei Scripten hin? Ich habe folgende zwei Mini-Programme:
Sender: ----------------------8<----------------- import time l = open('myfifo',mode='w',buffering=1) [...] ----------------------8<-----------------
Empfänger: ----------------------8<----------------- l = open('myfifo', buffering=1) [...] ----------------------8<-----------------
Was ist mit l.flush() ?
Es ist nicht die Sender-Seite, die das Problem macht, sondern der Empfänger. Ersetzt man den Empfänger durch "cat myfifo", kommen die Zeilen sofort.
Wo sollte man denn beim Empfänger das l.flush() hinsetzen?
flush() ist nur beim Sender sinnvoll. Thomas -- Thomas Guettler, http://www.thomas-guettler.de/ E-Mail: guettli (*) thomas-guettler + de
Ole Streicher wrote:
TOFU repariert.
http://de.wikipedia.org/wiki/TOFU
Jens Diemer <python_gmane@jensdiemer.de> writes:
Am 30.08.2011 13:53, schrieb Ole Streicher:
wie bekomme ich eine zeilengepufferte Kommunikation zwischen zwei Scripten hin? Ich habe folgende zwei Mini-Programme:
Sender: ----------------------8<----------------- import time l = open('myfifo',mode='w',buffering=1) [...] ----------------------8<-----------------
Empfänger: ----------------------8<----------------- l = open('myfifo', buffering=1) [...] ----------------------8<-----------------
Was ist mit l.flush() ?
Es ist nicht die Sender-Seite, die das Problem macht, sondern der Empfänger. Ersetzt man den Empfänger durch "cat myfifo", kommen die Zeilen sofort.
Versuche for line in iter(l.readline, ""): ... statt for line in l: ... Letzteres erreicht seine Effizienz mittels eines internen Puffers...
Am 30.08.2011 15:28 schrieb Ole Streicher:
Es ist nicht die Sender-Seite, die das Problem macht, sondern der Empfänger. Ersetzt man den Empfänger durch "cat myfifo", kommen die Zeilen sofort.
ACK. Es liegt wohl an der m.E. suboptimalen Implementierung des Zeileniterators von Dateiobjekten. Wenn man statt über l über iter(l.readline, '') iteriert, klappt es besser, allerdings muß man manuell die \n abtrennen. Thomas
Thomas Rachel writes:
Es liegt wohl an der m.E. suboptimalen Implementierung des Zeileniterators von Dateiobjekten.
Wenn man statt über l über iter(l.readline, '') iteriert, klappt es besser, allerdings muß man manuell die \n abtrennen.
Mit readline klappt es problemlos, danke. Etwas überraschend, dass der Zeileniterator anders als readline funktioniert. Warum ist das so? Viele Grüße Ole
Am 30.08.2011 17:06 schrieb Ole Streicher:
Mit readline klappt es problemlos, danke.
Etwas überraschend, dass der Zeileniterator anders als readline funktioniert. Warum ist das so?
Genau weiß ichs auch nicht, aber es hat wohl mit dem internen Buffering zu tun. Der Standard-Iterator (SI) scheint grundsätzlich seine volle Blockgröße lesen zu wollen, readline (rl) hingegen nur so viel, wie es grad bekommt. Will sagen: SI ruft so was auf wie fileobject.read(X), welches intern nach Möglichkeit versucht, X Bytes zu lesen, und verarbeitet dann erst weiter. Erst wenn ein EOF kommt, wird der Versuch abgebrochen. rl ruft eher so was wie os.read(fileobject.fileno(), X) auf. Da kommen bis zu X Bytes raus, wenn aber gerade weniger da sind, eben nur die. Und die werden dann auch gleich weiterverarbeitet. Daher reagiert es schneller. Warum dieser Unterschied gemacht wird, weiß ich auch nicht. Thomas
participants (4)
-
Ole Streicher -
Peter Otten -
Thomas Guettler -
Thomas Rachel