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 است؟

ویژگیGoroutineThread
حجم~۲ کیلوبایت~۱ مگابایت
تعداد ممکنصدها هزارچند هزار
مدیریتruntime Goسیستم‌عامل
سوئیچخیلی ارزانگران
Goroutine ها روی چند Thread واقعی توزیع می‌شوند — همزمانی واقعی روی چند هسته CPU!

این مبحث بخشی از دوره آموزش کامل گو است.

ابزارهای مرتبط