English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تعليم Golang الأساسي

تعليمات التحكم في Golang

دوال(Methods) في Golang

structures في Golang

slices وarrays في Golang

Strings في Golang

مؤشرات في Golang

واجهات في Golang

التعامل مع التوازي في Golang

استثناءات (Error) في Golang

متنوعة أخرى في Golang

التعاون (Goroutines) في Go

يقدم لغة Go ميزة خاصة تسمى Goroutines. Goroutine هوالدالةأو الطريقة، يمكن تنفيذها بشكل مستقل ومتوازٍ مع أي Goroutine أخرى موجودة في البرنامج. بمعنى آخر، كل نشاط يتم تنفيذه في نفس الوقت في لغة Go يسمى Goroutines، يمكنك اعتبار Goroutines كthreads خفيفة. مقارنة بالthreads، تكلفة إنشاء Goroutines صغيرة جدًا. كل برنامج يحتوي على على الأقل Goroutine واحد، ويُسمى هذا GoroutineGoroutine الرئيسيةإذا انتهت Goroutine الرئيسية، فإن جميع Goroutines التي تشغلها تنتهي أيضًا، فإن جميع goroutines الموجودة في البرنامج ستكون قد انتهت أيضًا؛ Goroutines تعمل دائمًا في الخلفية.

كيف يمكن إنشاء Goroutine؟

يمكنك استخدام كلمة المفتاح 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

  • Goroutines أقل تكلفة من threads.

  • يتم تخزين Goroutines في stack، ويمكن زيادة حجم stack وتقليله وفقًا لمتطلبات البرنامج. ولكن في thread، حجم stack ثابت.

  • يمكن استخدام قنوات للتواصل بين Goroutines، وقد تم تصميم هذه القنوات بشكل خاص لتجنب ظهور حالات التنافس عند الوصول إلى ذاكرة مشتركة باستخدام Goroutines.

  • افترض أن برنامجًا يحتوي على thread، ولديه العديد من Goroutines مرتبطة به. إذا تم حجب أي Goroutine بسبب الحاجة إلى موارد، فإن جميع Goroutines المتبقية يتم توزيعها على thread OS الجديدة. هذه التفاصيل مخفية للبرمجيات.

Goroutine مجهولة

في لغة 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
تحيةً!! إلى وظيفة الرئيسية