GoDasturchi
WaitGroups: Waiting for Goroutines to Finish

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:

example.go
var counter int32
atomic.AddInt32(&counter, 1)  // xavfsiz, hatto ko'plab goroutinalar bir vaqtda chaqirsa ham

Bu — 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.

Hints (0/4)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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:

example.go
var counter int32
atomic.AddInt32(&counter, 1)  // xavfsiz, hatto ko'plab goroutinalar bir vaqtda chaqirsa ham

Bu — 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.

Hints (0/4)

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