Sobes.tech
Junior — Middle

Чӣ тавр модели кор бо рақобат ва ҳамоҳангсозӣ дар забони 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 дар параллел кор мекунанд ва канал барои гирифтани натиҷаҳо аз ҳар яке истифода мешавад.