لغة Go بالأمثلة: المزامنة باستخدام القنوات

يمكننا استخدام القنوات لمزامنة التنفيذ بين روتينات Go. يوضح هذا المثال استخدام عملية استقبال حاجزة لانتظار انتهاء روتين Go. عند انتظار انتهاء عدة روتينات Go، قد تفضل استخدام مجموعة انتظار.

package main
import (
    "fmt"
    "time"
)

هذه هي الدالة التي سنشغّلها داخل روتين Go. ستُستخدم القناة done لإشعار روتين Go آخر بأن عمل هذه الدالة قد انتهى.

func worker(done chan bool) {
    fmt.Print("working...")
    time.Sleep(time.Second)
    fmt.Println("done")

أرسل قيمة للإشعار بأننا انتهينا.

    done <- true
}
func main() {

ابدأ روتين Go عاملًا، ومرر إليه القناة التي سيرسل الإشعار عبرها.

    done := make(chan bool, 1)
    go worker(done)

احجب التنفيذ حتى نستقبل إشعارًا من العامل عبر القناة.

    <-done
}
$ go run channel-synchronization.go      
working...done                  

إذا حذفت السطر <- done من هذا البرنامج، فقد يخرج البرنامج قبل أن ينهي worker عمله، أو حتى قبل أن يبدأ في بعض الحالات.

المثال التالي: .