Kako je model rada sa konkurentnošću i sinhronizacijom implementiran u jeziku Go?
sobes.tech АИ
Одговор од АИ
U jeziku Go, konkurentnost je implementirana putem laganih niti nazvanih goroutine. Goroutine se pokreću pomoću ključne riječi go i rade paralelno, dok runtime Go-a sam upravlja njihovim rasporedom.
Za sinhronizaciju i razmjenu podataka između goroutine-a koristi se nekoliko mehanizama:
-
Kanal (channels) — omogućavaju siguran prenos podataka između goroutine-a, osiguravajući sinhronizaciju. Kanali se mogu smatrati redovima koji blokiraju pošiljaoca ako su puni i primaoca ako su prazni.
-
Paket sync — sadrži primitive za sinhronizaciju poput mutexa (
sync.Mutex), uslovnih promenljivih (sync.Cond), grupa čekanja (sync.WaitGroup) i drugih.
Primer korišćenja goroutine-a i kanala:
package main
import (
"fmt"
"time"
)
func worker(id int, ch chan string) {
time.Sleep(time.Second)
ch <- fmt.Sprintf("Radnik %d završio", 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)
}
}
Ovde tri goroutine rade paralelno, a kanal se koristi za primanje rezultata od svake od njih.