Introduction to Goroutines
Goroutinalarga kirish
Shu paytgacha yozgan har bir dasturingiz ketma-ket ishladi: bir qator tugagach, keyingisi boshlandi. Goroutina — Go'ning yengil ip (thread)i, va uni ishga tushirish oson: har qanday funksiya chaqiruvi oldiga go kalit so'zini qo'yasiz.
func sayHello() {
fmt.Println("Salom!")
}
func main() {
go sayHello() // yangi goroutinada ishga tushadi
fmt.Println("Asosiy") // dastur buni kutmaydi
}go sayHello() chaqirilgan zahoti, main funksiyasi sayHelloning tugashini kutmasdan keyingi qatorga o'tadi. Shu sababli yuqoridagi dasturni ishga tushirsangiz, ba'zan "Salom!" chop etilishga ulgurmasdan main tugab, butun dastur yopilib qolishi mumkin — goroutina asosiy dastur bilan parallel, undan mustaqil ishlaydi.
Bu — Errors Are Values darsida ko'rgan "Go hech narsani sizdan yashirmaydi" falsafasining davomi: go kalit so'zi juda oddiy ko'rinsa-da, u sizga darhol muhim savol qo'yadi — "asosiy dastur qachon goroutina tugashini bilishi kerak?" Keyingi darsda aynan shu savolga sync.WaitGroup yordamida javob berasiz.
for i := 0; i < 3; i++ {
go fmt.Println(i)
}
// Bu uchta goroutina qaysi tartibda (yoki umuman) chop etilishi
// kafolatlanmagan — goroutinalar mustaqil rejalashtiriladi.Muhim xulosa: goroutinalar arzon (minglab goroutina yaratish oddiy funksiya chaqiruvidek yengil) va mustaqil rejalashtiriladi. Ular bilan ishlashning markaziy muammosi — natijalarni qachon va qanday xavfsiz yig'ib olish, va aynan shu narsa ushbu kursning qolgan darslarining mavzusi bo'ladi.
Key Takeaway
Key Takeaway:
go f() funksiyani yangi, mustaqil goroutinada ishga tushiradi va darhol qaytadi — asosiy dastur uning tugashini kutmaydi. Goroutinalar juda arzon, lekin ularning natijalarini xavfsiz kutish va yig'ish uchun maxsus vositalar (sync.WaitGroup, kanallar) kerak bo'ladi.
NEXT UP
WaitGroup: Coordinating Goroutines