Go範例:通道同步

我們可以使用通道來同步 goroutine 裡的執行。這裡有一個使用阻擋接收來等待 goroutine 完成的例子。當要等待多個 goroutine 完成時,你可能會想用 WaitGroup

package main
import (
    "fmt"
    "time"
)

這是我們會在 goroutine 裡執行的函式,將會使用 done 通道來通知另一個 goroutine 該函式的執行已經完成。

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

傳送一個數值來通知我們已經完成。

    done <- true
}
func main() {

開始一個工作者 goroutine,傳遞要通知的通道給它。

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

阻擋,直到我們在通道上收到工作者的通知。

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

如果你從這個程式中移除 <- done 這行,這個程式會在 worker 開始前就結束。

下一篇範例:通道方向