Junior — Middle
Bir nechta goroutine bilan bir vaqtning o'zida kanal orqali ma'lumotlarni xavfsiz o'qishni qanday amalga oshirish mumkin?
sobes.tech AI
AIdan javob
Go tilida, bir kanaldan bir vaqtning o'zida bir nechta gorutinlar tomonidan xavfsiz o'qish uchun odatda quyidagi yondashuvlardan biri qo'llaniladi:
-
Bir yuboruvchi, bir nechta qabul qiluvchi — kanal yaratiladi va bir nechta gorutinlar undan o'qiydi. Go'da kanal bir nechta gorutinlardan bir vaqtning o'zida xavfsiz o'qishga mo'ljallangan, shuning uchun bir kanal bilan bir nechta gorutinlarni ishga tushirish mumkin.
-
sync.WaitGroupdan foydalanish bilan sinxronizatsiya qilish — barcha gorutinlar tugashini kutish uchun.
Misol:
package main
import (
"fmt"
"sync"
)
func worker(id int, ch <-chan int, wg *sync.WaitGroup) {
defer wg.Done()
for val := range ch {
fmt.Printf("Ishchi %d qabul qildi %d\n", id, val)
}
}
func main() {
ch := make(chan int)
var wg sync.WaitGroup
// 3 ta gorutinni ishga tushiramiz, ular kanaldan o'qiydi
for i := 1; i <= 3; i++ {
wg.Add(1)
go worker(i, ch, &wg)
}
// Kanalga ma'lumot yuboramiz
for i := 0; i < 10; i++ {
ch <- i
}
close(ch) // Kanalni yopamiz, shunda gorutinlar tugaydi
wg.Wait() // Barcha gorutinlar tugashini kutamiz
}
Shu tarzda, Go'dagi kanal allaqachon bir nechta gorutinlardan o'qishda xavfsiz kirishni ta'minlaydi, muhim bo'lsa, ularning hayot aylanishini to'g'ri boshqarish va kanalni yopishdir.