Чӣ тавр модели кор бо рақобат ва ҳамоҳангсозӣ дар забони Go амалӣ карда мешавад?
sobes.tech AI
Ҷавоб аз AI
Дар забонҳои Go, рақобатпазирӣ тавассути ҷараёнҳои сабук — goroutine-ҳо — амалӣ мешавад. Goroutine-ҳо бо калиди калид go оғоз мешаванд ва дар параллел кор мекунанд, дар ҳоле ки runtime-и 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 дар параллел кор мекунанд ва канал барои гирифтани натиҷаҳо аз ҳар яке истифода мешавад.