مقدمه
در برنامهنویسی مدرن، اجرای همزمان یا Concurrent Programming یکی از مفاهیم کلیدی برای افزایش بهرهوری و کارایی برنامههاست. زبان Go با معرفی مفهومی بهنام Goroutine، امکان اجرای همزمان کد را بسیار ساده و قدرتمند کرده است. در این مقاله به بررسی کامل Goroutines میپردازیم و مثالهایی کاربردی برای درک بهتر آن ارائه میدهیم.
Goroutine چیست؟
در زبان Go، هر زمان که شما از کلمهی کلیدی go
قبل از یک تابع استفاده میکنید، آن تابع به صورت Goroutine اجرا میشود. Goroutine یک Thread بسیار سبک و سریع است که توسط Runtime زبان Go مدیریت میشود.
package main
import (
"fmt"
"time"
)
func sayHello() {
fmt.Println("سلام از Goroutine!")
}
func main() {
go sayHello() // اجرای تابع بهصورت Goroutine
time.Sleep(1 * time.Second) // منتظر بمان تا Goroutine اجرا شود
}
در مثال بالا، تابع sayHello
به صورت همزمان با تابع main
اجرا میشود.
ویژگیهای Goroutine
- سبک بودن: مصرف حافظهی بسیار کم (حدود ۲ کیلوبایت در زمان ساخت)
- مدیریت توسط Runtime: نیاز به مدیریت Thread ندارید، همه چیز توسط Runtime انجام میشود.
- مقیاسپذیری بالا: میتوانید هزاران Goroutine اجرا کنید بدون اینکه منابع سیستم را مصرف زیادی کند.
همگامسازی بین Goroutines
برای ارتباط یا همگامسازی بین Goroutines، از مفهومی بهنام Channel استفاده میشود.
func count(ch chan int) {
for i := 1; i <= 5; i++ {
ch <- i // ارسال داده به کانال
}
close(ch)
}
func main() {
ch := make(chan int)
go count(ch)
for num := range ch {
fmt.Println(num)
}
}
نکات مهم در استفاده از Goroutines
- اگر Goroutineها به منابع مشترک دسترسی دارند، باید از Mutex یا Channel برای جلوگیری از Race Condition استفاده کنید.
- همیشه از
WaitGroup
برای اطمینان از اتمام همهی Goroutineها قبل از خروج از برنامه استفاده کنید.
var wg sync.WaitGroup
func worker(id int) {
defer wg.Done()
fmt.Printf("Worker %d is working\n", id)
}
func main() {
for i := 1; i <= 3; i++ {
wg.Add(1)
go worker(i)
}
wg.Wait()
}
جمعبندی
Goroutines یکی از مهمترین قابلیتهای زبان Go هستند که برنامهنویسان را قادر میسازند تا به سادهترین شکل ممکن برنامههای همزمان بنویسند. در این مقاله با مفاهیم پایه، کاربردها و مثالهای عملی آن آشنا شدید. پیشنهاد میکنم با تمرین بیشتر، مهارت خود در استفاده از Goroutines را افزایش دهید.
مطالعه بیشتر: