25.آموزش GO با مثال(هماهنگ سازی کانال)

ما از کانالها برای اجرایی کردن هماهنگ سازی ها در سرتا سر goroutineها استفاده میکنیم. اینجا یک مثال از استفاده اونها رو داریم که یک دریافت به حالت بلاک شده تا پایان کار یک goroutine صبر میکند.

package main
import "fmt"
import "time"

این تابعی است که در یک goroutine اجرا میشود. کانال doneبرای اعلان کردن goroutine دیگری استفاده میشود و این مفهوم را میرساند که این تابع کارش را به اتمام رسانده است.

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

ارسال یک مقدار برای اینکه نشان دهیم ما این کار را انجام داده ایم.

   done <- true
}
func main() {

یک goroutine به نام worker آغاز میشود, که یک اعلان روی آن پیاده شده است.

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

تا زمانی که ما یک اعلان را از سمت worker که رو channelهست دریافت کنیم برنامه مسدود است.

   <-done
}

اجرای این برنامه

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

اگر شما خط done-> را از این برنامه پاک کنید, برنامه قبل از این که رویداد worker شروع شود تمام خواهد شد.

<<بافر کردن کانال---------------------------------- هدایت کانال>>