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.