2010-11-06 7 views
5

Ich habe viele Themen gefunden, die mehr oder weniger mit diesem Thema zu tun haben und immer noch fast nichts wie vollständige Antwort ... Ich bin auf der Suche nach Ihrem Rat darauf.Wenn Popen.communicate() nicht genug ist?

Also, hier ist mein Problem: Ich muss wirklich mit einem Subprozess auf beide Arten kommunizieren: Ich muss eine Menge Daten zu seinem Eingang schreiben und seine Ausgabe im laufenden Betrieb erhalten. Es gibt keinen Weg darum herum. Mein Subprozess ist ein berühmter 'lahmer' MP3-Encoder, der Input ist ein PCM-Sound von einer Stunde oder mehr, der von meiner Funktion erzeugt wird. Die Ausgabe ist die MP3-Datei, die auch Chunk für Chunk gesendet werden muss, ohne auf den Encoder zu warten.

Laut der Dokumentation wird Popen.communicate() mir nicht helfen, IPC in Dutzenden oder Hunderten von Megabyte zu verarbeiten. Zur gleichen Zeit, wie ich von hier gelernt habe, ist es sehr gefährlich zu versuchen, diesen Ansatz von Grund auf neu zu erstellen, da viele Fallstricke warten: Deadlocks, Pufferung, Prozessmanagement, etc.

Also meine Frage ist: Gibt es eine bekannte Lösung für diese Art von Problem: eine Python-Lib oder ein Codebeispiel, das das Problem wirklich löst? Vielleicht gibt es zumindest einen Artikel oder etwas, das klar die meisten Probleme beschreibt, denen man begegnen kann, wenn man versucht, das selbst zu lösen?

Vielen Dank im Voraus, Ilya.

Antwort

2

Der einfachste Weg ist, teilen Sie Ihr eigenes Programm in zwei: eine, die an LAME schreibt und die andere, die liest von lame und schreibt an den Benutzer. Dies ist viel einfacher als bidirektionale Kommunikation.

Wenn das nicht für Sie funktioniert, habe ich die Entwicklung mit Named Pipes viel einfacher als herkömmliche Pipe IPC gefunden. Es ist einfach, verschiedene Arten von Rohrleitungen während des Testens zu verwenden. Nonblocking I/O in Python 3 sollte den Zugriff darauf erleichtern.

+0

Wenn ich Ihre Idee habe, muss ich drei Kindprozess starten: einen zum Erstellen von Eingabedaten und Schreiben zu lahm, einen zum Ausführen der Lahme und einen zum Abrufen der Ausgabe und zum Übertragen an den Benutzer. Was mich hier erschreckt, ist der Gedanke, dass ich die ganze überwachende Logik implementieren muss: auf Kinder warten, die Signale abfangen und Kinder am Elternausgang töten und umgekehrt usw. – izhak

+0

Wie bei NB in ​​Python 3 - danke, Ich werde es lesen. Leider muss diese spezielle Aufgabe auf ein paar gemeinsam genutzte Hostings laufen, wo Python 2.4 eine traurige Realität ist. – izhak

+0

Die drei Kinder waren genau das, was ich vorhatte. Aber du hast Recht, es ist immer noch nervig zu implementieren. Die beste Diskussion der Probleme ist immer noch Advanced Programming in der UNIX-Umgebung - siehe http://www.kohala.com/start/apue.html - was ich sehr empfehlen kann. – max