Go'da channels
Go tilida goroutine yordamida bir nechta vazifalarni bir vaqtda, mustaqil tarzda bajarish mumkin. Ammo goroutinelar o'zaro qanday ma’lumot almashadi? Bir vazifa boshqa bir vazifaga natijani qanday yetkazadi? Ana shu savollarga javob berishda channellar muhim rol o'ynaydi.
Channel — bu Go tilidagi maxsus obyekt bo'lib, goroutinelar o'rtasida ma’lumot uzatishni xavfsiz va tartibli tarzda amalga oshirish imkonini beradi. Oddiy qilib aytganda, channel — bu ma’lumot oqimiga o'xshash bo'lib, bir goroutine yozsa, boshqasi uni o'qib oladi. Bu orqali siz goroutinelar orasida sinxronlashuvga erishishingiz mumkin.
Info
Channel - Goroutine
lar o'rtasida ma'lumot almashish uchun mo'ljallangan ma'lumot turi.
Channels chan
va make
kalit so'zlari bilan e'lon qilinadi. Channelni e'lon qilishda biror paketni import qilishga hojat yo'q.
Channel e'lon qilish
Oddiy int channel:
Channel nima va u qanday e'lon qilinishi tushunib oldik endi bu channelga ma'lumot qanday yozilishi va o'qilishini ko'rib chiqamiz.
Channel orqali ma'lumot uzatish uchun quyidagi operatorlardan foydalanamiz:
ch <- value
— channelga ma’lumot yozish (send)value := <- ch
— channeldan ma’lumot o'qish (receive)
Misol:
package main
import "fmt"
func main() {
ch := make(chan int) // int tipidagi channel
// Goroutine orqali ma’lumot yozish
go func() {
ch <- 2025 // channelga qiymat yuboramiz
}()
// Channeldan ma’lumot o'qish
val := <-ch
fmt.Println("Channeldan o'qilgan qiymat:", val)
}
Natija:
- go func() yordamida goroutine ishga tushadi va ch <- 42 orqali channelga 42 ni yozadi.
- val := <-ch kod qatori shu qiymatni kutadi va oladi.
- Natijada fmt.Println(...) orqali ekranga quyidagicha chiqadi:
Channellar bir tomonlama (unidirectional) va ikki tomonlama (bidirectional) ko'rinishda ishlaydi. Bu channel'larning ma’lumotni faqat yozish yoki faqat o'qish imkoniyatiga ega bo'lishini bildiradi.
deadlock ga olib boruvchi xato
Agar channeldan foydalanganimizda yuboruvchi qism bo'lsayu lekin qabul qiluvchi bo'lmasa deadlock
sodir bo'ladi.
Misol:
Natija:
Xulosa qiladigan bo'lsak channel'ga ma'lumot yubordikmi, uni qabul qilish qismini ham albatta yozishimiz shart. Yuqoridagi xatolik runtimeda sodir bo'ladi.
Nega channel kerak? Goroutinelar o'zida yetarli emasmi?
Faqat goroutine’lar yetarli emas. Ular faqat ishni parallel yoki concurrent bajaradi. Ammo ularning o'zaro hamkorligi (ma’lumot almashuvi, sinxronlashuv) uchun channel kerak. Real misol keltiradigan bo'lsak HTTP so'rovlarini parallel yuborish kerak, sizda bir nechta tashqi API manbalar bor. Har biriga goroutine orqali so'rov yuborasiz, natijalarni channel orqali yig'asiz.