ich eine Verarbeitungskette, die entlang dieser Linien geht:Persistent subprocess Pipeline - lesen stdout ohne
- Preprocess Daten in wenigen Schritten, die ruft Perl, Bash und Python-Skripte von einer einzelnen Bash-Skript enthalten, Verbindungs diejenigen, die über Rohre
- Transformation von Daten in Python (das Programm, das ich leider verwenden laufe nicht auf Python 3, so dass ich glaube, ich bin 2.7 gezwungen, laufen)
- Nachbearbeiten Daten wie in der Vorverarbeitungsschritt
Eine Möglichkeit, dies vorher gearbeitet hat, ist
cat input | preprocess.sh | transform.py | postprocess.sh
Und das funktioniert gut mit der Verarbeitung von Chargen von Eingangsdaten.
Allerdings muss ich dies jetzt als Server-Funktionalität in Python implementieren - ich muss in der Lage sein, ein einzelnes Datenelement zu akzeptieren, die Pipeline auszuführen und sie schnell wieder auszuspucken.
Der zentrale Schritt, den ich gerade aus Python heraus anrufe, ist der einfache Teil. Die Nachbearbeitung ist auch relativ einfach.
Hier ist das Problem: der Vorverarbeitungscode besteht aus 4 verschiedenen Skripten, von denen jedes Daten an die nächste ausgibt und von denen zwei Modelldateien von der Festplatte in den Arbeitsspeicher laden müssen. Dieses Laden ist relativ langsam und macht schreckliche Dinge zu meiner Ausführungszeit. Ich denke also, ich muss sie irgendwie im Gedächtnis behalten, schreibe an ihre stdin
s und lese die Ausgabe.
Allerdings finde ich, dass für jeden einzelnen Link in meiner Kette, kann ich nicht zu stdin
schreiben und lesen stdout
ohne stdin
zu schließen, und das würde das Verfahren unbrauchbar machen, wie ich würde dann den Prozess wieder öffnen muß, und laden Sie die Modell erneut.
Sie beachten Sie, dass dies kein Problem mit meiner Skripte ist, wie für jedes Glied in der Kette
cat input_data | preprocessing_script_i.sh
kehrt genau das, was es soll innerhalb von Bash.
Hier sind die Dinge, die ich versucht habe bis jetzt:
- einfach zu schreiben, um
stdin
undflush
es - wartet auf unbestimmte Zeit auf Readline- process.communicate
- tötet den Prozess und ist somit nicht in Frage.- indem Master- und Slave-
pty
Griffen - hängt an Readline- - eine Warteschlange und ein Gewinde Verwendung
stdout
zu lesen, während aufstdin
vom Hauptthread - Herumspielen Schreiben mit
bufsize
im Aufruf vonsubprocess
Gibt es eine Möglichkeit, dies von Python aus zu tun? Ist das überhaupt möglich, wenn ich das bezweifle? Kann ich diese Pipeline (ohne die Elemente zu berühren, wie es für meinen Anwendungsfall nicht möglich ist) in einer anderen Sprache neu implementieren?
Könnten Sie eine Named Pipe (FIFO) verwenden, statt stdout und stdin zu verketten? – Hannu
@Hannu Ich kann vielleicht, sobald ich herausfinden, was das ist - habe nicht von der Named Pipe Begriff gehört. Ich werde nach einigem googeln wieder zu dir kommen! – Perfi
'os.mkfifo ("/tmp/mypipe ")' würde Sie erstellen. Oder Sie können es in der Shell mit 'mknod/tmp/mypipe p' machen. Sie können dies als eine Datei für Lese- und Schreibzwecke behandeln und von einem Prozess schreiben und von einem anderen lesen. – Hannu