[Python-de] fifo mit readline() auslesen

Georg Mischler schorsch at schorsch.com
Die Feb 8 16:34:38 CET 2005


Christian Helmbold wrote:

mport os, select
>
> fifo = "annahme"

delay = 5 # sekunden

>
> try:
>     os.mkfifo(fifo)
> except:
>     print "fifo konnte nicht erzeugt werden!"
>
> #ff = os.open(fifo, os.O_RDONLY)

ff = os.open(fifo, os.O_RDONLY, os.O_NDELAY) # ohne Blockieren

>
> while True:
>     print "loop"
>     #select.select([ff], [], [])

    select.select([ff],[],[], delay)

>     print os.read(ff, 1)


Ich weiss natürlich nicht, ob das deinen Vorstellungen schon
entspricht, aber es zeigt zumindest in welche Richtung du
weiterdenken solltest. In der Schlaufe kannst du entweder Daten
sammeln, bis du genug hast, oder nach einer gewissen Zeit wieder
aufgeben. Die sinnvolle Grösse von "delay" hängt davon ab, wie
schnell du ggf. auf anderweitige Ereignisse reagieren können
musst.


> Wenn ich das richtig sehe, wird das Durchdrehen bei der Variante mit Threads
> nur durch das Schlafen abgemildert.

Hast du die Doku zu select gelesen? Der vierte Parameter gibt
das timeout an, wie lange du auf eine Antwort warten willst.


> Aber ich will den Serverprozess auf keinen Fall schlafen legen.

Wenn du auf Daten warten willst, dann musst du in jedem Fall
schlafen. Entweder duch eine blockierende read()-ähnliche
Funktion, durch den timeout von select(), oder explizit.
Wenn du zwischendurch *im gleichen Thread* noch andere Dinge
erledigen willst, dann wird es etwas komplizierter.


> Scheint so, als müsste ich doch das
> _blockierende_ open() in die Schleife packen. Oder habe ich irgendwas
> grundlegend falsch verstanden?

Möglicherweise hast du den folgende semantischen Unterschied noch
nicht in allen Konsequenzen durchgedacht:
- Warten darauf, bis ein anderer Prozess die fifo zum schreiben
  öffnet.
- Warten darauf, bis aus der fifo ausreichend Daten gelesen
  werden können.


-schorsch

-- 
Georg Mischler  --  simulations developer  --  schorsch at schorsch com
+schorsch.com+  --  lighting design tools  --  http://www.schorsch.com/