Sobes.tech
Junior — Middle

Go dilində rəqabət və sinxronizasiya ilə işləmə modeli necə həyata keçirilir?

sobes.tech Süni İntellekt

AI-dan cavab

Go dilində rəqabətlilik yüngül iş parçaları — goroutine-lər vasitəsilə həyata keçirilir. Goroutine-lər go açar sözü ilə işə salınır və paralel işləyir, bu zaman Go-ın vaxt idarəetməsi onların planlaşdırılmasını müstəqil şəkildə həyata keçirir.

Goroutine-lər arasında sinxronizasiya və məlumat mübadiləsi üçün müxtəlif mexanizmlər istifadə olunur:

  • Kanal (channels) — goroutine-lər arasında təhlükəsiz məlumat ötürməyə imkan verir və sinxronizasiyanı təmin edir. Kanallar, tam olduqda göndərəni, boş olduqda isə qəbul edən tərəfi bloklayan növbələr kimi qəbul edilə bilər.

  • sync paketi — mutexlər (sync.Mutex), şərti dəyişənlər (sync.Cond), gözləmə qrupları (sync.WaitGroup) və digər primitive-ləri ehtiva edir.

Goroutine və kanallardan istifadə nümunəsi:

package main
import (
    "fmt"
    "time"
)

func worker(id int, ch chan string) {
    time.Sleep(time.Second)
    ch <- fmt.Sprintf("İşçi %d tamamlandı", 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)
    }
}

Burada üç goroutine paralel işləyir və kanal hər birindən nəticələri almaq üçün istifadə olunur.