2016-03-20 6 views
1

Ich stieß beim Piping auf ein interessantes Problem. Angenommen, ich möchte das asynchrone Verhalten zwischen Pipes emulieren, sodass ich einen einzelnen übergeordneten Prozess und mehrere untergeordnete Prozesse habe. Die Eltern- und Kindprozesse können miteinander kommunizieren. Etwas, auf das ich gestoßen bin, ist jedoch, dass die Kommunikation bisher atomar ist. Das heißt, dass, wenn ich einen Datensatz habenDas asynchrone Verhalten mit Rohren

  • 1. Zuerst alle Kinder schaffen
  • 2. Senden Sie eine chunk_size von Daten des Datensatzes an die Kinder über eine Schleife
  • 3. Kinder hat einige Berechnung oder nichts und übergibt seine Daten zurück an die Mutter
  • 4. Elternteil empfängt die Daten von ihren Kindern

jedoch das Problem ist, dass meine Kommunikation atomar ist, ich habe alle meine Daten senden und lesen sie es dann. Das Senden ist in Ordnung, da das Kind es fast augenblicklich liest und sich daher nicht darum kümmern muss, dass sich das Rohr füllt. Alle Kinder erledigen jedoch ihre Arbeit und geben ihre Daten zurück, aber die Eltern lesen das erst, wenn alle Daten gesendet sind. Das heißt, ein Rohr kann sich während Schritt für eines der untergeordneten Elemente zu dem übergeordneten Element füllen, bevor das übergeordnete Element sogar Schritt erreicht hat. Eine Möglichkeit, dies zu vermeiden, besteht darin, Daten einfach zu senden und dann zu empfangen, bevor wir erneut einen anderen Datensatz senden, was jedoch den gesamten Punkt ruiniert. Ein anderer Weg ist es, noch einmal fork() und ein anderes Kind damit umzugehen. Aber das verschiebt das Problem nur woanders hin. Ich denke, das ist ein Problem mit meinem Design, aber es scheint unmöglich, weil mein Code in einem einzigen Prozess an zwei Stellen gleichzeitig sein muss! (Das sind reading und writing Daten für die Kinder). Gibt es Best Practices oder Rückblick auf das Design von "echtem" asynchronem Verhalten, das bei dieser Methode nur Pipes verwendet?

+1

Es ist nicht klar, was Ihre genaue Sorge ist. "Ein Rohr kann sich für eines der Kinder zum Elternteil füllen". Das ist richtig, aber Sie müssen angeben, warum das ein Problem für Sie ist. Wenn die Pipe gefüllt wird, blockiert der Kindprozess beim 'Schreiben'-Aufruf. Das kann oder kann nicht das gewünschte Verhalten sein. Wenn dies nicht der Fall ist, müssen Sie erklären, warum und welches Verhalten Sie erreichen möchten. Je nachdem, welches "asynchrone" Verhalten Sie versuchen zu erreichen, werden die üblichen Techniken verwendet, um entweder das E/A-Multiplexen mit etwas wie "Auswählen" oder "Abfragen" oder Threading zu verwenden. – kaylum

Antwort

2

Sie können das mit select tun. Select zeigt Ihnen an, wenn eine Ihrer Pipes zum Lesen oder Schreiben bereit ist.

+0

Verwenden Sie 'select()' nicht im neuen Code. Verwenden Sie stattdessen 'poll()'. – Dummy00001