Heim > Artikel > Backend-Entwicklung > Wie kann ein Go-Multiplexer einen fairen und sicheren Zugriff über mehrere Eingangskanäle hinweg gewährleisten?
Ein Kanal-Multiplexer mit gleichem Zugriff
Dieser Go-Multiplexer zielt darauf ab, die Ausgänge mehrerer Kanäle zu einem zusammenzuführen und so sicherzustellen, dass jeder Eingangskanal über einen Kanal verfügt gleiche Rechte am Ausgabekanal haben. Der bereitgestellte Test liefert jedoch unerwartete Ergebnisse.
Analyse des Problems
Das kritische Problem liegt in den Goroutinen, die aus der Mux-Funktion hervorgegangen sind. Der Kanalparameter c, der jeden Eingabekanal darstellen soll, wird bei jeder Iteration der Schleife aktualisiert. Dies bedeutet, dass alle Goroutinen am Ende aus demselben Kanal statt aus den vorgesehenen einzelnen Kanälen ziehen.
Lösung
Um dieses Problem zu beheben, ändern Sie die Goroutine-Erstellungsschleife in „Pass“. der richtige Kanal zu jeder Goroutine:
for _, c := range channels { go func(c <-chan big.Int) { ... }(c) }
Auf diese Weise erfasst jede Goroutine den Wert des Kanals, wenn er erstellt wird, beseitigt das Problem und erzeugt das gewünschte Ergebnisse.
Verbesserung der Parallelitätssicherheit
Neben der Gewährleistung eines gleichberechtigten Zugriffs auf den Ausgabekanal ist es von entscheidender Bedeutung, die Parallelitätssicherheit sicherzustellen. Der anfängliche Code verwendet eine int-Variable n, um das Schließen von Eingabekanälen zu verfolgen. Wenn GOMAXPROCS jedoch größer als 1 ist, ist es möglich, dass mehrere Goroutinen gleichzeitig auf n zugreifen, was möglicherweise zu Race-Bedingungen führt.
Ein sichererer Ansatz ist die Verwendung eines sync.WaitGroup-Objekts, das es Goroutinen ermöglicht, aufeinander zu warten und stellt sicher, dass n sicher aktualisiert wird. Der überarbeitete Code mit einer sync.WaitGroup:
import ( "math/big" "sync" ) // ... other code ... // The channel to output to. ch := make(chan big.Int, len(channels)) var wg sync.WaitGroup wg.Add(len(channels)) // ... other code ... // Close the channel when the pumping is finished. go func() { // Wait for everyone to be done. wg.Wait() // Close. close(ch) }()
Mit diesen Änderungen arbeitet der Multiplexer jetzt korrekt und sicher, wodurch sichergestellt wird, dass alle Eingangskanäle gleichen Zugriff auf den Ausgangskanal haben und Race Conditions vermieden werden.
Das obige ist der detaillierte Inhalt vonWie kann ein Go-Multiplexer einen fairen und sicheren Zugriff über mehrere Eingangskanäle hinweg gewährleisten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!