Wie schließe ich einen Kanal, auf dem mehrere Goroutines senden?

8

Ich versuche parallel Berechnungen durchzuführen. Das Programm ist so konzipiert, dass jede Worker-Goroutine "Teile" eines gelösten Puzzles an die Controller-Goroutine zurücksendet, die darauf wartet, alles zu empfangen und zu assemblieren, das von den Worker-Routinen gesendet wurde.

Was ist die Idomatik zum Schließen des Einzelkanals? Ich kann den Kanal nicht in jeder Goroutine aufrufen, weil ich dann möglicherweise einen geschlossenen Kanal senden könnte. Ebenso gibt es keine Möglichkeit vorher festzulegen, welche Goroutine als erstes beendet wird. Ist hier eine sync.WaitGroup notwendig?

    
Bill DeRose 30.03.2013, 04:08
quelle

2 Antworten

9

Hier ist ein Beispiel, das sync.WaitGroup verwendet, um das zu tun, wonach Sie suchen,

Dieses Beispiel akzeptiert eine lange Liste von Ganzzahlen und summiert sie dann, indem Sie N parallelen Arbeitern einen gleichgroßen Teil der Eingabedaten übergeben. Es kann auf Spielplatz gehen :

%Vor%     
jimt 30.03.2013, 12:42
quelle
4

Ja, dies ist ein perfekter Anwendungsfall für sync.WaitGroup.

Ihre andere Option besteht darin, 1 Kanal pro Goroutine und eine Multiplexer-Routine zu verwenden, die von jedem Kanal in einen einzelnen Kanal einspeist. Aber das würde schnell unhandlich werden, also würde ich einfach mit einer sync.WaitGroup gehen.

    
Jeremy Wall 30.03.2013 04:13
quelle

Tags und Links