Sobes.tech
Junior — Middle

Go тилинде атаандаштык жана синхрондоштуруу менен иштөө модели кандай ишке ашырылат?

sobes.tech AI

AIден жооп

Go тилинде атаандаштык жеңил жиптер аркылуу ишке ашырылат — goroutine-ler. Goroutine-ler go ачкыч сөзү менен ишке киргизилет жана параллел иштейт, ал эми Go-дун runtime өзү алардын пландаштырылышын көзөмөлдөйт.

Goroutine-lerдин ортосунда синхрондоштуруу жана маалымат алмашуу үчүн бир нече механизмдер колдонулат:

  • Каналдар (channels) — goroutine-лер арасында коопсуз маалымат өткөрүүгө мүмкүндүк берет жана синхрондоштурууну камсыздайт. Каналдарды кезек деп эсептесе болот, алар толуп калса жөнөтүүчүнү блоктоп, бош болсо кабыл алуучуну.

  • sync пакети — mutexтер (sync.Mutex), шарттуу өзгөрмөлөр (sync.Cond), күтүү топтору (sync.WaitGroup) жана башка primitives камтыйт.

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 параллел иштейт жана канал ар биринен натыйжаларды алуу үчүн колдонулат.