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_probability_of_duplicates

Also, kauf schonmal so ein Wolfram-Carbid-Gehaeuse…

Diez