Middle
Mit lehet és mit nem szabad tenni a Go csatornákban lévő szálbiztonsággal?
sobes.tech MI
Válasz az MI-től
Lehet:
- Adatok küldése és fogadása. Minden olvasási és írási művelet egy csatornában atomikus.
- Csatorna bezárása. A bezárás jelzi, hogy a adatküldés befejeződött.
- Az
selectoperátor használata nem blokkoló interakcióhoz több csatornával. - Bufferelt és nem bufferelt csatornák használata különböző szinkronizációs forgatókönyvekhez.
Nem szabad:
- Egy csatorna bezárása több goroutine-ból egyszerre további szinkronizáció nélkül. Ez pánikot okozhat.
- Már bezárt csatorna bezárása. Ez szintén pánikot okoz.
- Adatok küldése egy bezárt csatornába. Ez pánikot eredményez.
- Null (nem inicializált) csatornából olvasás várása. Ez blokkolja a goroutine-t.
- Null (nem inicializált) csatornába írás várása. Ez blokkolja a goroutine-t.
Csatornák használatának példája:
// Nem bufferelt csatorna létrehozása int típushoz
messages := make(chan int)
// Goroutine adatküldéshez
go func() {
messages <- 1 // 1 küldése a csatornára
messages <- 2 // 2 küldése a csatornára
close(messages) // A csatorna bezárása küldés után
}()
// Adatok olvasása a csatornából
firstMessage := <-messages
secondMessage := <-messages
// Egy lezárt csatornából való olvasás a null értéket és ok=false értéket ad vissza
value, ok := <-messages