Sobes.tech
Junior — Middle

Go tilida raqobat va sinxronizatsiya bilan ishlash modeli qanday amalga oshiriladi?

sobes.tech AI

AIdan javob

Go tilida raqobatlikni amalga oshirish uchun yengil oqimlar — goroutine lar ishlatiladi. Goroutine lar go kalit so'zi yordamida ishga tushiriladi va parallel ravishda ishlaydi, bu paytda Go-ning ish vaqti ularning rejalashtirishini o'zlari boshqaradi.

Goroutine lar o'rtasida sinxronizatsiya va ma'lumot almashinuvi uchun bir nechta mexanizmlar mavjud:

  • Kanal (channels) — goroutine lar o'rtasida xavfsiz ma'lumot uzatishni ta'minlaydi va sinxronizatsiyani kafolatlaydi. Kanallarni navbatlar deb hisoblash mumkin, ular to'ldirilgan bo'lsa, yuboruvchini bloklaydi, bo'sh bo'lsa, qabul qiluvchini.

  • sync paket — mutexlar (sync.Mutex), shartli o'zgaruvchilar (sync.Cond), kutish guruhlari (sync.WaitGroup) va boshqalarni o'z ichiga oladi.

Goroutine va kanallarni ishlatish misoli:

package main
import (
    "fmt"
    "time"
)

func worker(id int, ch chan string) {
    time.Sleep(time.Second)
    ch <- fmt.Sprintf("Ishchi %d tugadi", 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)
    }
}

Bu yerda uchta goroutine parallel ravishda ishlaydi va kanal har biridan natijalarni olish uchun ishlatiladi.