Goroutines
همزمانی سبکوزن در Go با Goroutine ها — مهمترین ویژگی زبان Go.
Goroutine چیست؟
Goroutine یک نخ اجرای سبکوزن است که توسط runtime مدیریت میشود — قلب همزمانی Go! میتوانید صدها هزار Goroutine همزمان داشته باشید (در مقابل Thread های سنگین سیستمعامل).
ساخت Goroutine — فقط go!
func sayHello() {
fmt.Println("سلام از goroutine!")
}
func main() {
go sayHello() ← با کلیدواژه go اجرای همزمان
fmt.Println("سلام از main!")
}
تابع بینام بهعنوان Goroutine
go func() {
fmt.Println("در goroutine!")
}() ← فراموش نکنید () را صدا بزنید!
مشکل: برنامه زودتر تمام میشود!
func main() {
go func() {
time.Sleep(time.Second)
fmt.Println("دیر رسیدم!") ← هرگز چاپ نمیشود!
}()
// main تمام میشود قبل از goroutine
}
وقتی
main تمام شود، همه Goroutine ها میمیرند — بدون صبر کردن! برای همگامسازی از WaitGroup یا Channel استفاده کنید.راهحل ۱: time.Sleep (فقط برای تست)
func main() {
go func() {
fmt.Println("از goroutine")
}()
time.Sleep(time.Second) ← بدترین روش! فقط دمو
}
راهحل ۲: sync.WaitGroup (استاندارد)
var wg sync.WaitGroup
wg.Add(1) ← یک کار اضافه شد
go func() {
defer wg.Done() ← کار تمام شد
fmt.Println("کار انجام شد")
}()
wg.Wait() ← صبر کن همه تمام شوند
fmt.Println("همه تمام شدند!")
چند Goroutine موازی
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1)
go func(n int) {
defer wg.Done()
fmt.Println("goroutine شماره", n)
}(i)
}
wg.Wait()
چرا Goroutine بهتر از Thread است؟
| ویژگی | Goroutine | Thread |
|---|---|---|
| حجم | ~۲ کیلوبایت | ~۱ مگابایت |
| تعداد ممکن | صدها هزار | چند هزار |
| مدیریت | runtime Go | سیستمعامل |
| سوئیچ | خیلی ارزان | گران |
Goroutine ها روی چند Thread واقعی توزیع میشوند — همزمانی واقعی روی چند هسته CPU!
این مبحث بخشی از دوره آموزش کامل گو است.