English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
يقدم لغة Go ميزة خاصة تسمى Goroutines. Goroutine هوالدالةأو الطريقة، يمكن تنفيذها بشكل مستقل ومتوازٍ مع أي Goroutine أخرى موجودة في البرنامج. بمعنى آخر، كل نشاط يتم تنفيذه في نفس الوقت في لغة Go يسمى Goroutines، يمكنك اعتبار Goroutines كthreads خفيفة. مقارنة بالthreads، تكلفة إنشاء Goroutines صغيرة جدًا. كل برنامج يحتوي على على الأقل Goroutine واحد، ويُسمى هذا GoroutineGoroutine الرئيسيةإذا انتهت Goroutine الرئيسية، فإن جميع Goroutines التي تشغلها تنتهي أيضًا، فإن جميع goroutines الموجودة في البرنامج ستكون قد انتهت أيضًا؛ Goroutines تعمل دائمًا في الخلفية.
يمكنك استخدام كلمة المفتاح go كمقدمة لدعوة الدالة أو الطريقة لإنشاء Goroutine الخاصة بك، مثل الجملة التالية:
النحو:
func name() { //أمر } // استخدام كلمة المفتاح go قبل اسم الدالة go name()
package main import "fmt" func display(str string) { for w := 0; w < 6; w++ { fmt.Println(str) } } func main() { // تنفيذ Goroutine go display("مرحبًا") // دعوة دالة عادية display("oldtoolbag.com") }
الإخراج:
oldtoolbag.com oldtoolbag.com oldtoolbag.com oldtoolbag.com oldtoolbag.com oldtoolbag.com
في هذا المثال، قمنا بإنشاءdisplay()الدوال، ثم دعوة هذه الدالة بطرقين مختلفين، الأولى هي Goroutine، أي go display("Welcome")، والثانية هي دعوة الدالة العادية، أي display("w3codebox")
لكن قد لاحظت أنك تواجه مشكلة، لأنه يظهر فقط نتائج الدعوة إلى الدوال العادية، وليس نتائج Goroutine، لأن دعوة Goroutine الجديدة تعود فورًا عند تنفيذ Goroutine. إنها لا تنتظر تنفيذ Goroutine كما تفعل الدوال العادية، بل تستمر في التقدم إلى السطر التالي بعد دعوة Goroutine، وتتجاهل القيم التي تعود من Goroutine. لذلك، من أجل تنفيذ Goroutine بشكل صحيح، قمنا ببعض التغييرات في البرنامج، مثل الكود التالي:
مثال Goroutine بعد التعديل:
package main import ( "fmt" "time" ) func display(str string) { for w := 0; w < 6; w++ { time.Sleep(1 * time.Second) fmt.Println(str) } } func main() { // تنفيذ Goroutine go display("مرحبًا") //استدعاء وظيفة عادية display("w3codebox") }
الإخراج:
مرحبًا w3codebox w3codebox مرحبًا مرحبًا w3codebox w3codebox مرحبًا مرحبًا w3codebox w3codebox
لقد أضفنا طريقة Sleep() في البرنامج، مما يجعل Goroutine الرئيسية تنام لمدة ثانية بينما تنفذ Goroutine الجديدة، يظهر في الشاشة ترحيب، ثم تنشط Goroutine الرئيسية مرة أخرى وتنفذ عملياتها بعد إعادة جدولة ثانية لمدة ثانية، وتبدأ هذه العملية حتى أن قيمة z أقل من 6، ثم تنتهي Goroutine الرئيسية. هنا، تعمل Goroutine والوظائف العادية في نفس الوقت.
Goroutines أقل تكلفة من threads.
يتم تخزين Goroutines في stack، ويمكن زيادة حجم stack وتقليله وفقًا لمتطلبات البرنامج. ولكن في thread، حجم stack ثابت.
يمكن استخدام قنوات للتواصل بين Goroutines، وقد تم تصميم هذه القنوات بشكل خاص لتجنب ظهور حالات التنافس عند الوصول إلى ذاكرة مشتركة باستخدام Goroutines.
افترض أن برنامجًا يحتوي على thread، ولديه العديد من Goroutines مرتبطة به. إذا تم حجب أي Goroutine بسبب الحاجة إلى موارد، فإن جميع Goroutines المتبقية يتم توزيعها على thread OS الجديدة. هذه التفاصيل مخفية للبرمجيات.
في لغة Go، يمكنك أيضًا تشغيل Goroutine للاسماء المجهولة، بمعنى آخر، يمكنك ببساطة إنشاء Goroutine مجهولة باستخدام كلمة المفتاح go كحرف مقدم للوظيفة، كما هو موضح في النحو التالي:
النحو:
//استدعاء مجهول go func(قائمة_المتغيرات){ //أمر }(الاستدعاءات)
package main import ( "fmt" "time" ) func main() { fmt.Println("مرحبًا!! بزيارة وظيفة الرئيسية") //إنشاء Goroutine مجهولة go func() { fmt.Println("مرحبًا!! بزيارة oldtoolbag.com") ()} time.Sleep(1 * time.Second) fmt.Println("تحيةً!! إلى وظيفة الرئيسية") }
الإخراج:
مرحبًا!! بزيارة وظيفة الرئيسية مرحبًا!! بزيارة oldtoolbag.com تحيةً!! إلى وظيفة الرئيسية