Junior — Middle
Hogyan valósítható meg biztonságos adatolvasás egy csatornából több goroutine-ban egyszerre?
sobes.tech MI
Válasz az MI-től
Go nyelvben a több goroutine által történő biztonságos csatornázás olvasásához általában az alábbi megközelítések egyikét alkalmazzák:
-
Egy küldő, több fogadó — egy csatorna létrehozása, és több goroutine olvas belőle. A Go csatornája biztonságos több goroutine által történő egyidejű olvasásra, így elegendő több goroutine-t indítani, amelyek ugyanabból a csatornából olvasnak.
-
sync.WaitGrouphasználata szinkronizációhoz — hogy megvárjuk, amíg minden goroutine befejeződik.
Példa:
package main
import (
"fmt"
"sync"
)
func worker(id int, ch <-chan int, wg *sync.WaitGroup) {
defer wg.Done()
for val := range ch {
fmt.Printf("Munkás %d kapott %d\n", id, val)
}
}
func main() {
ch := make(chan int)
var wg sync.WaitGroup
// 3 goroutine indítása, amelyek olvasnak a csatornából
for i := 1; i <= 3; i++ {
wg.Add(1)
go worker(i, ch, &wg)
}
// Adatok küldése a csatornára
for i := 0; i < 10; i++ {
ch <- i
}
close(ch) // A csatorna lezárása, hogy a goroutine-ok befejeződjenek
wg.Wait() // Várakozás minden goroutine befejezésére
}
Így a Go csatorna már biztosítja a biztonságos hozzáférést több goroutine olvasásakor, a fő feladat a helyes életciklus kezelés és a csatorna lezárása.