Go با مثال: همگام‌سازی با کانال

می‌توانیم از کانال‌ها برای همگام‌سازی اجرا بین گوروتین‌ها استفاده کنیم. این مثالی است از استفادهٔ یک دریافت مسدودکننده برای منتظر ماندن تا پایان کار یک گوروتین. وقتی منتظر پایان چند گوروتین هستید، شاید بهتر باشد از WaitGroup استفاده کنید.

package main
import (
    "fmt"
    "time"
)

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

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

یک مقدار می‌فرستیم تا خبر دهیم کارمان تمام شده.

    done <- true
}
func main() {

یک گوروتین worker را راه می‌اندازیم و کانالی را که باید از طریق آن خبر بدهد به آن می‌دهیم.

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

تا وقتی از طریق کانال خبری از worker دریافت نکنیم، مسدود می‌مانیم.

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

اگر خط <- done را از این برنامه حذف کنید، ممکن است برنامه پیش از تمام شدن کار worker خارج شود، یا در برخی موارد حتی پیش از شروع آن.

مثال بعدی: .