Sobes.tech
Junior — Middle

Mi történik először: a törlési jel feldolgozása vagy a felvétel befejezése, ha egyidejűleg történnek a csatornában?

sobes.tech MI

Válasz az MI-től

Go nyelven, amikor egyidejűleg próbálsz küldeni egy leállítási jelet (például egy csatorna bezárásával vagy érték küldésével) és befejezni a csatornára írást, a feldolgozás sorrendje nem garantált, és a goroutine ütemezőjétől és a csatornák állapotától függ. A csatornák Go-ban szinkronizálják a műveleteket, de ha két művelet egyidejűleg történik, az egyik végrehajtódik először, de ezt a specifikáció nem határozza meg.

Vagyis, ha egy goroutine megpróbál írni egy csatornába, és egy másik goroutine ugyanakkor bezárja ezt a csatornát vagy leállítási jelet küld, nem lehet meghatározni, melyik műveletet dolgozza fel először. Fontos úgy tervezni a logikát, hogy ne függjön az ilyen egyidejű események sorrendjétől.

Példa:

cancel := make(chan struct{})
data := make(chan int)

// Goroutine, amely a cancel-t hallgatja
go func() {
    select {
    case <-cancel:
        fmt.Println("Leállítás érkezett")
    case v := <-data:
        fmt.Println("Kapott érték", v)
    }
}()

// Egyidejű küldés
close(cancel) // leállítási jel
// vagy
// data <- 42 // írás a csatornába

Ebben a példában, hogy melyik ág hajtódik végre elsőként, a ütemezőtől függ.