Re: [Python-de] Temporäres Fifo erzeugen

"Diez B. Roggisch" deets@web.de writes:
On Sep 21, 2012, at 12:07 PM, Olе Streicher wrote:
wie kann man in Python einen Fifo mit einem temporären Namen erzeugen? os.mkfifo() möchte ja einen expliziten Dateinamen tempfile.mkstemp() produziert nur eine reguläre Datei, und diese einfach zu löschen und dann als Pipe neu anzulegen hört sich unsicher an (race conditions).
Wieso? Ist doch ein zufälliger Name, und wenn du willst, kannst du zB gemeinsame Suffixe verwenden, und alle abräumen, die nicht mehr gültig sind.
Nö; es könnte z.B. sein, dass zufällig ein anderes Programm zwischen dem Löschen und dem Neuanlegen den gleichen Dateinamen anlegt. Nicht umsonst wird bei mkstemp() ein gewisser Aufwand für die Transaktionssicherheit getrieben.
Oder du benutzt sockets. Oder ZeroMQ.
Das hilft beides nicht.
Und jetzt warte ich auf deine ganzen "Ja, Abers"… denn noch wissen wir ja nix über deinen wirklichen Anwendungsfall, und ich hab's da im Urin, das der Ober-spezial ist...
Ich habe eine Bibliothek, die eine Logdatei (mit einstellbarem Namen) schreibt -- als Datei. Was in diese Datei geschrieben wird, möchte ich aber gerne direkt in einen kleinen Server füttern (ohne dass etwas auf die Platte geschrieben wird), der daraus seinerseits schöne Python-logging-events macht. Dazu muss ich dieser Bibliothek die Logdatei als Fifo unterjubeln. Weil der eigentliche Dateiname dann irrelevant ist (und das Programm natürlich auch mehrfach laufen soll), eben als temporären Dateinamen.
Ich finde das eher eine Alltagsaufgabe denn als Ober-spezial.
Viele Grüße
Ole

On 21.09.2012 13:07, Olе Streicher wrote:
Ich habe eine Bibliothek, die eine Logdatei (mit einstellbarem Namen) schreibt -- als Datei. Was in diese Datei geschrieben wird, möchte ich aber gerne direkt in einen kleinen Server füttern (ohne dass etwas auf die Platte geschrieben wird), der daraus seinerseits schöne Python-logging-events macht. Dazu muss ich dieser Bibliothek die Logdatei als Fifo unterjubeln.
Ein Möglichkeit wäre ein spezielles FUSE-Dateisystem dafür zu implementieren.
http://sourceforge.net/apps/mediawiki/fuse
oder
http://code.google.com/p/fusepy/
Chris

On Sep 21, 2012, at 1:07 PM, Olе Streicher wrote:
"Diez B. Roggisch" deets@web.de writes:
On Sep 21, 2012, at 12:07 PM, Olе Streicher wrote:
wie kann man in Python einen Fifo mit einem temporären Namen erzeugen? os.mkfifo() möchte ja einen expliziten Dateinamen tempfile.mkstemp() produziert nur eine reguläre Datei, und diese einfach zu löschen und dann als Pipe neu anzulegen hört sich unsicher an (race conditions).
Wieso? Ist doch ein zufälliger Name, und wenn du willst, kannst du zB gemeinsame Suffixe verwenden, und alle abräumen, die nicht mehr gültig sind.
Nö; es könnte z.B. sein, dass zufällig ein anderes Programm zwischen dem Löschen und dem Neuanlegen den gleichen Dateinamen anlegt. Nicht umsonst wird bei mkstemp() ein gewisser Aufwand für die Transaktionssicherheit getrieben.
Und los geht's… es könnte auch sein, dass dein Rechner von einem Meteoriten getroffen wird - hast du ich auch ein Wolfram-Carbid-Gehauese spendiert?
Die beschriebenen Race-Conditions sind eher in Grenzfällen zu erwarten. Wenn du also zB tausenden Dateien gleichzeitig von Dutzenden Prozessen erzeugen lässt. Die du erstmal haben müsstest. Aber wozu die Mühe machen, die zu ergründen oder zu erläutern - so lässt sich das ganze ja besser als Schild gegen Vorschläge verwenden…
Und jetzt warte ich auf deine ganzen "Ja, Abers"… denn noch wissen wir ja nix über deinen wirklichen Anwendungsfall, und ich hab's da im Urin, das der Ober-spezial ist...
Ich habe eine Bibliothek, die eine Logdatei (mit einstellbarem Namen) schreibt -- als Datei. Was in diese Datei geschrieben wird, möchte ich aber gerne direkt in einen kleinen Server füttern (ohne dass etwas auf die Platte geschrieben wird), der daraus seinerseits schöne Python-logging-events macht. Dazu muss ich dieser Bibliothek die Logdatei als Fifo unterjubeln. Weil der eigentliche Dateiname dann irrelevant ist (und das Programm natürlich auch mehrfach laufen soll), eben als temporären Dateinamen.
Ich finde das eher eine Alltagsaufgabe denn als Ober-spezial.
Oh, die *Aufgabe* ist völlig alltäglich. Oberspezial ist nur dein Bestehen darauf, dass es ein Problem mit Race-Conditions gibt. Aber selbst wenn es das gäbe: os.mkfifo verlangt, dass die Datei nicht existiert. Du kannst also zb eine Schleife machen, und so lange die auftretende Exception auffangen, bis du einen Treffer hast. Wie wäre es, wenn du das probierst, und gleichzeitig mitloggst, wie oft diese Schleife mehr als einmal durchlaufen wurde? Würde mich mal interessieren…
Du kannst auch eine UUID4 verwenden. Zu der Chance, das die kollidiert empfehle ich das hier zu lesen:
http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_proba...
Also, kauf schonmal so ein Wolfram-Carbid-Gehaeuse…
Diez

Am 21.09.2012 13:07, schrieb Olе Streicher:
Nö; es könnte z.B. sein, dass zufällig ein anderes Programm zwischen dem Löschen und dem Neuanlegen den gleichen Dateinamen anlegt. Nicht umsonst wird bei mkstemp() ein gewisser Aufwand für die Transaktionssicherheit getrieben.
Wie wäre es damit, die temporäre Datei in einem temporären Verzeichnis anzulegen? Das würde die Race-Condition doch (zumindest was "denial of service" durch andere User angeht) verringern, oder?
fs

*** Ol?? Streicher wrote:
"Diez B. Roggisch" deets@web.de writes:
Wieso? Ist doch ein zufälliger Name, und wenn du willst, kannst du zB gemeinsame Suffixe verwenden, und alle abräumen, die nicht mehr gültig sind.
Nö; es könnte z.B. sein, dass zufällig ein anderes Programm zwischen dem Löschen und dem Neuanlegen den gleichen Dateinamen anlegt.
Hier steigt python mit "Failed to create FIFO: [Errno 17] File exists" aus, wenn die Datei schon existiert. Das sollte also kein Problem sein.
Micha

Am Samstag, den 22.09.2012, 15:47 +0200 schrieb Michael Meyer:
*** Ol?? Streicher wrote:
"Diez B. Roggisch" deets@web.de writes:
Wieso? Ist doch ein zufälliger Name, und wenn du willst, kannst du zB gemeinsame Suffixe verwenden, und alle abräumen, die nicht mehr gültig sind.
Nö; es könnte z.B. sein, dass zufällig ein anderes Programm zwischen dem Löschen und dem Neuanlegen den gleichen Dateinamen anlegt.
Hier steigt python mit "Failed to create FIFO: [Errno 17] File exists" aus, wenn die Datei schon existiert. Das sollte also kein Problem sein.
Micha _______________________________________________ python-de maillist - python-de@python.org http://mail.python.org/mailman/listinfo/python-de
Würde nicht folgendes funktionieren?
import errno import os import tempfile
def mktempfifo(): while True: try: return os.mkfifo(tempfile.mktemp()) except IOError as e: if e.errno is errno.EEXIST: continue else: raise
LG Alexander
participants (6)
-
Alexander Schlarb
-
Christopher Arndt
-
Diez B. Roggisch
-
Felix Schwarz
-
Michael Meyer
-
ole-usenet-spam@gmx.net