WaitGroups: Waiting for Goroutines to Finish
WaitGroup: goroutinalar tugashini kutish
Oldingi darsda results[i] = n * n xavfsiz edi, chunki har bir goroutina slice'ning boshqa indeksiga yozgan. Lekin ba'zida barcha goroutinalar bitta umumiy qiymatni (masalan, hisoblagichni) o'zgartirishi kerak bo'ladi. Oddiy counter++ bu yerda ishlamaydi — bir nechta goroutina bir vaqtda o'qib-yozishi mumkin va yangilanishlar yo'qolib qoladi.
sync/atomic paketi son turlarini xavfsiz o'zgartirish uchun maxsus funksiyalar beradi — ular "bo'linmas" (atomic) amalga oshiriladi, ya'ni boshqa goroutina uni yarim yo'lda ko'ra olmaydi:
var counter int32
atomic.AddInt32(&counter, 1) // xavfsiz, hatto ko'plab goroutinalar bir vaqtda chaqirsa hamBu — DNS Resolver kursidagi pointerlar bilan joyida o'zgartirish g'oyasining davomi: atomic.AddInt32 ham &counter manzilini oladi va shu manzildagi qiymatni xavfsiz o'zgartiradi. Keyingi darslarda siz sync.Mutexni ham ko'rasiz — u istalgan turdagi ma'lumotni himoya qiladi, atomic esa faqat oddiy sonlar uchun tezroq, maxsuslashtirilgan yechim.
>_ Exercise
CountCompleted(tasks []func()) int32 funksiyasini yozing. Har bir vazifa (func()) uchun alohida goroutina ishga tushiring: u vazifani chaqiradi, so'ngra atomic.AddInt32 bilan umumiy hisoblagichni bittaga oshiradi. sync.WaitGroup bilan barcha goroutinalar tugashini kutib, hisoblagichni qaytaring.
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
sync/atomic — bir nechta goroutina bitta sonni bir vaqtda xavfsiz o'zgartirishi uchun maxsuslashtirilgan vosita. U sync.Mutexdan tezroq, lekin faqat oddiy sonlar uchun ishlaydi; murakkabroq umumiy holat uchun Mutex kerak bo'ladi — buni keyinroq ko'rasiz.
NEXT UP
Channels: Sending and Receiving Values
$ go run main.go
Kodingizni ishga tushiring