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