Sobes.tech
Junior — Middle

Milyen feltételek mellett történik a blokkolás a szabványos adatátviteli csatornával való munka során?

sobes.tech MI

Válasz az MI-től

Go-ban az alapértelmezett adatátviteli csatorna a következő esetekben blokkolódik:

  • Amikor értéket küldünk a csatornára (chan <- value), ha a csatorna nem bufferelt vagy a buffer megtelt, a küldő gorutina blokkolódik, amíg egy másik szál nem olvassa ki az értéket.
  • Amikor a csatornából olvasunk (value := <- chan), ha a csatorna üres, az olvasó gorutina blokkolódik, amíg adatok nem érkeznek.

Így a blokkolás akkor történik, amikor megpróbálunk adatot küldeni egy tele csatornára vagy olvasni egy üres csatornából, ezáltal biztosítva a gorutinek közötti szinkronizációt.

Példa:

ch := make(chan int) // buffer nélküli csatorna

// Küldés blokkol, amíg valaki nem olvas
 go func() {
    ch <- 42
}()

érték := <-ch // az olvasás feloldja a küldést
fmt.Println(érték)