Ich bin Debug-Anwendung, die Informationen von 2 Sensoren sammeln: eine Webcam und ein Mikrofon.
Die allgemeine Architektur ist ziemlich einfach:
Kind & amp; Hauptprozesse sind in unendlichen Schleifen, um Befehle zu verarbeiten (der Hauptprozess vom Benutzer, der Kindprozess vom Hauptprozess).
Es funktioniert global, aber ich habe Probleme, die untergeordneten Prozesse zu stoppen.
Ich habe den Code eingeloggt und es scheint 2 Dinge zu passieren:
Das Verhalten ist eindeutig mit dem Status der Verbindung verknüpft, da untergeordnete Prozesse, die nichts zurückliefern, dieses Verhalten nicht haben. Dennoch sehe ich nicht, wie man die aktuelle Architektur, die vernünftig erscheint, debuggt / modifiziert.
Also, was verursacht dieses blockierende Verhalten und wie man es vermeidet?
Dies ist der Code, der für jede Iteration der Endlosschleife im Kindprozess ausgeführt wird:
%Vor%update : Es scheint, dass die Pipe nicht gleichzeitig an beiden Enden geschrieben werden kann. Es funktioniert, wenn Sie die letzten Zeilen des obigen Codes in:
ändern %Vor%Die Frage bleibt offen, da Pipe standardmäßig als Vollduplex dokumentiert ist und dieses Verhalten überhaupt nicht dokumentiert ist. Ich muss etwas falsch verstanden haben. Bitte, erleuchte mich!
update 2 : Nur um klar zu sein, ist in dieser Situation keine Verbindung geschlossen. Um die Reihenfolge der Ereignisse zu beschreiben:
Ein Vollduplex multiprocessing.Pipe
wird als socketpair()
implementiert. Der Aufruf von .send
kann für alle normalen Gründe blockieren, wenn mit einem Socket gesprochen wird. Aufgrund Ihrer Beschreibung ist es wahrscheinlich, dass der Leser von Pipe
das Lesen beendet hat und sich Daten in den Puffern im Kernel bis zu dem Punkt angesammelt haben, an dem Ihre .send
blockiert.
Wenn Sie explizit .close
auf der Empfängerseite eingeben, erhalten Sie wahrscheinlich eine Art von Fehler (obwohl möglicherweise auch SIGPIPE
, nicht sicher), wenn Sie .send
versuchen. Wenn Ihre empfangende Verbindung nicht mehr verfügbar ist, geschieht dies wahrscheinlich automatisch. Sie können das Problem möglicherweise beheben, indem Sie vorsichtiger vorgehen, keine Referenzen (direkt oder indirekt) auf der Empfängerseite zu speichern, damit die Zuordnung aufgehoben wird, wenn dieser Thread nicht mehr vorhanden ist.
Trivial-Demo von blocking .send
:
Beachten Sie, dass nach einiger Zeit der Ausdruck "send!" beendet wird.
Tags und Links python pipe multiprocessing