Sobes.tech
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:

  1. 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.

  2. sync.WaitGroup haszná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.