Sobes.tech
Junior — Middle

როგორ არის განხორციელებული კონკურენციისა და სინქრონიზაციის მოდელი ენის Go-ში?

sobes.tech AI

პასუხი AI-სგან

Go ენის კონკურენტობა განხორციელებულია მსუბუქი ნაკადების — goroutine-ების საშუალებით. Goroutine-ები იწყება საკვანძო სიტყვა go-ს გამოყენებით და მუშაობს პარალელურად, ამ დროს Go-ის runtime-ი თვითონ მართავს მათი დაგეგმვას.

Goroutine-ების შორის სინქრონიზაციისა და მონაცემთა გაცვლისთვის გამოიყენება რამდენიმე მექანიზმი:

  • კანალები (channels) — უზრუნველყოფს უსაფრთხო მონაცემთა გადაცემას goroutine-ებს შორის და სინქრონიზაციას. კანალებს შეიძლება შევხედოთ როგორც რიგებს, რომლებიც ბლოკავენ გამგზავნს, თუ ისინი სავსეა, და მიმღებს, თუ ისინი ცარიელია.

  • sync პაკეტი — შეიცავს სინქრონიზაციის primitives-ებს, როგორიცაა mutex-ები (sync.Mutex), პირობითი ცვლადები (sync.Cond), მოლოდინის ჯგუფები (sync.WaitGroup) და სხვა.

Goroutine-ებისა და კანალების გამოყენების მაგალითი:

package main
import (
    "fmt"
    "time"
)

func worker(id int, ch chan string) {
    time.Sleep(time.Second)
    ch <- fmt.Sprintf("მუშაკი %d დასრულდა", 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)
    }
}

აქ სამი goroutine პარალელურად მუშაობს, და კანალი გამოიყენება თითოეულის შედეგების მისაღებად.