AzLearn

الغوروتينات

Goroutines

مفهوم ~18 دقيقة

الغوروتينات — Goroutines

تخيّل أنك في مطعم. في النموذج التقليدي، هناك نادل واحد يخدم طاولة واحدة في كل مرة — إذا طاولة طلبت شيئاً يأخذ وقتاً، كل الطاولات الأخرى تنتظر. في نموذج Go، هناك عشرات النوادل الخفيفين يخدمون كل الطاولات بالتوازي — وكل نادل لا يكلّف شيئاً تقريباً.

هذا هو مفهوم goroutine: خيط تنفيذ خفيف الوزن يعمل بالتزامن مع باقي البرنامج.

ما هي الـ goroutine؟

  • هي دالة تعمل بشكل متزامن مع دوال أخرى
  • أخف بكثير من خيوط نظام التشغيل (thread) — حوالي 2KB من الذاكرة مقابل ~1MB للخيط
  • يمكنك تشغيل آلاف أو ملايين منها بدون مشاكل
  • Go runtime يدير جدولتها (scheduling) تلقائياً

كلمة go

لتشغيل goroutine، أضف كلمة go قبل استدعاء الدالة:

main.go

لاحظ كيف أن الرسائل تتداخل — هذا لأنها تعمل بالتزامن! ترتيب الرسائل قد يتغير في كل تشغيل.

goroutine مع دالة مجهولة

main.go

⚠️ الخطأ الكلاسيكي: متغير الحلقة

هذا من أشهر الأخطاء في Go (تم إصلاحه في Go 1.22 لكن يجب فهمه):

main.go

دورة حياة goroutine

goroutine تنتهي عندما:

  1. الدالة التي تعمل فيها تنتهي (return)
  2. الدالة الرئيسية main تنتهي — عندها كل goroutines تتوقف فوراً!

هذا يعني أنك تحتاج طريقة لانتظار goroutines — وهنا تأتي القنوات (الدرس القادم) و sync.WaitGroup.

مثال عملي: تنزيل متوازي

main.go

كم goroutine يمكنك تشغيلها؟

main.go

عشرة آلاف goroutine! جرّب ذلك مع threads في Java أو Python — ستواجه مشاكل. في Go، هذا عادي تماماً.

ملخص مهم

المفهومالتفاصيل
go f()يبدأ goroutine جديد
الحجم~2KB (مقابل ~1MB للـ thread)
العدديمكن تشغيل الملايين
الجدولةGo runtime يديرها تلقائياً
الإيقافتنتهي مع الدالة أو مع main
التحذيرtime.Sleep ليس حلاً حقيقياً — استخدم القنوات أو WaitGroup
تحدي — Challenge