|
Oldingi misolda biz bir nechta goroutina o’rtasidagi umumiy holatdan foydalanishni sinxronlash uchun mutexlar yordamida oshkora qulflashdan foydalandik. Yana bir variant - xuddi shu natijaga erishish uchun goroutinalar va kanallarning o’rnatilgan sinxronlash imkoniyatlaridan foydalanishdir. Bu kanalga asoslangan yondashuv Go’ning xotirani aloqa orqali bo’lishish va har bir ma’lumot bo’lagini aniq bitta goroutina egaligida saqlash g’oyalariga mos keladi. |
|
![]()
|
|
|
|
|
Bu misolda bizning holatimizning egasi bitta goroutina bo’ladi.
Bu ma’lumot bir vaqtning o’zida foydalanish bilan hech qachon
buzilmasligini kafolatlaydi. Bu holatni o’qish yoki yozish
uchun boshqa goroutinalar egasi bo’lgan goroutinaga xabarlar
yuboradi va mos javoblarni qabul qiladi. Bu |
|
|
|
|
Avvalgidek biz qancha amal bajarayotganimizni sanaymiz. |
|
|
|
|
|
Mana |
|
|
Bu |
|
|
Biz shunga o’xshash yondashuvdan foydalanib 10 ta yozishni ham ishga tushiramiz. |
|
|
Goroutinalar bir soniya ishlashiga ruxsat beramiz. |
|
|
Nihoyat, amal sonlarini olib chiqamiz va chop etamiz. |
|
|
Dasturimizni ishga tushirish goroutinaga asoslangan holatni boshqarish misoli jami taxminan 80,000 ta amalni bajarishini ko’rsatadi. |
|
|
Bu aniq holatda goroutinaga asoslangan yondashuv mutexga asoslanganidan biroz murakkabroq bo’ldi. Biroq u ayrim holatlarda foydali bo’lishi mumkin, masalan, boshqa kanallar ishtirok etganda yoki bir nechta shunday mutexlarni boshqarish xatolarga olib kelishi mumkin bo’lganda. Siz qaysi yondashuv eng tabiiy his qilinsa, ayniqsa dasturingiz to’g’riligini tushunish nuqtai nazaridan, o’shanidan foydalanishingiz kerak. |
Keyingi misol: Sorting.