Sobes.tech
Junior — Middle

Ինչպես է Go լեզվում իրականացվում մրցակցության և սինխրոնացման մոդելը։

sobes.tech AI

Պատասխան AI-ից

Go լեզվում մրցակցությունը իրականացնում է թեթև թելերով՝ goroutine-ներով։ Goroutine-ները սկսվում են go բանալի բառով և աշխատում են զուգահեռ, իսկ Go- ի ռունթայմը ինքնուրույն կառավարում է նրանց պլանավորումը:

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-ներ աշխատում են զուգահեռ, իսկ ճանալը օգտագործվում է արդյունքները ստանալու համար յուրաքանչյուրից։