Sobes.tech
Junior — Middle

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.