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)