Kuidas on Go keeles rakendatud konkurentsi ja sünkroniseerimise mudel?
sobes.tech AI
Vastus AI-lt
Go keeles konkurentsus realiseeritakse kergete niitide — goroutine'ide kaudu. Goroutine'id käivitatakse võtmesõnaga go ja töötavad paralleelselt, samal ajal kui Go jooksutõrge haldab nende ajastamist ise.
Goroutine'ide vahelise sünkroniseerimise ja andmevahetuse jaoks kasutatakse mitmeid mehhanisme:
-
Kanalid (channels) — võimaldavad turvaliselt andmeid goroutine'ide vahel edastada ning tagavad sünkroniseerimise. Kanaleid võib pidada järjekordadeks, mis blokeerivad saatjat, kui need on täis, ja vastuvõtjat, kui need on tühjad.
-
sync pakett — sisaldab sünkroniseerimise primitiive, nagu mutex'id (
sync.Mutex), tingimusmuutujad (sync.Cond), ootamisgrupid (sync.WaitGroup) ja teised.
Näide goroutine'ide ja kanalite kasutamisest:
package main
import (
"fmt"
"time"
)
func worker(id int, ch chan string) {
time.Sleep(time.Second)
ch <- fmt.Sprintf("Tööline %d lõpetas", id)
}
func main() {
ch := make(chan string)
for i := 1; i <= 3; i++ {
go worker(i, ch)
}
for i := 1; i <= 3; i++ {
msg := <-ch
fmt.Println(msg)
}
}
Siin töötavad kolm goroutine'i paralleelselt ning kanalit kasutatakse igaühe tulemuste saamiseks.