
Martin, danke fuer die ausfuehliche Antwort, du hast natuerlich Recht, jetzt sind auch mir die Zusammenhaenge klar geworden. Da kann man mal sehen - Python verleiht zwar Fluegel, aber deswegen kann man sich trotzdem nicht ueber solch profane Dinge wie Buffergroessen hinwegsetzen. Weiss jemand ob es angedacht ist eine der unten genannten Strategien zu integrieren und popen damit idiotensicher zu machen ? Juergen -----Original Message----- From: "Martin v. Löwis" [mailto:martin@v.loewis.de] Sent: 25 October 2006 13:05 To: Rauch, Juergen (Juergen) Cc: python-de@python.net Subject: Re: [Python-de] os.popen3 - child_stderr.read() haengt unter bestimmten Umstaenden (Win XP) Rauch, Juergen (Juergen) schrieb:
Was meint Ihr dazu ?
Ich finde das überhaupt nicht überraschend, sondern selbstverständlich. In Deinem Beispiel wird doch nichts auf stderr geschrieben, oder? Damit geht child_stderr.read() erst zuende, wenn child_stderr geschlossen wird (wenn also klar ist, dass da keine Daten mehr kommen). Die Frage ist nun, ob das print-Kommando im Kindprozess zuende geht oder nicht. print gibt auf stdout aus, aber das ist ja eine Pipe. Dh. das Betriebssystem puffert eine gewisse Menge Daten, aber nicht beliebig viele. Wenn die Pipe "voll" ist, werden weitere Schreibaktionen im Kindprozess blockiert, dh. der Kindprozess terminiert nicht. Der Kindprozess *würde* weiterarbeiten, wenn der Elternprozess aus der Pipe liest. Macht er aber (in test2Popen) nicht: er hängt ja im read auf stderr. Diese Situation nennt man "deadlock": beide Prozesse warten gegenseitig darauf, dass der andere eine bestimmte Aktion ausführt, die der aber nicht ausführen wird. Das Problem ist nicht Windows-spezifisch, nur die Puffergröße ist es. Probier's mal mit 100000 auf Linux; in Linux 2.6. ist die Puffergröße einer Pipe 64k. Es gibt drei traditionelle Lösungsstrategien für dieses Problem: 1) Multi-threading: stdout und stderr werden in separaten Threads gelesen 2) select/poll/WaitForMultipleObjects: anstatt blockierend zu lesen, testet man, von welchem Filedeskriptor gelesen werden kann 3) "Protokolle": zwischen Elternprozess und Kindprozess wird ein Regime festgelegt, bei dem der Pipe-Puffer nicht vollaufen kann (weil beide immer synchron lesen und schreiben). Diese Phänomene sind in jedem guten Buch über Betriebssysteme erläutert. Ciao, Martin _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de