看范例学 Golang (二十五)- Channel 同步

Channel 同步

我们使用 channel 来同步 goroutine 中执行的程序。 这里有一个使用阻塞接收来等待 goroutine 执行完毕的例子。

package main
import "fmt"
import "time"

这个函数将会运行在一个 goroutine 中, done channel 将会被用来通知另外的 goroutine 这段函数已经运行完毕。

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

发送一个值到 channel 表示函数已经执行完毕

    done <- true
}
func main() {

发起一个 goroutine ,并且给一个 channel 参数用来返回完成提醒。

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

程序会阻塞,之道收到 channel 中的返回值。

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

如果你删掉了 <- done 这行代码,那么主程序逻辑将会在执行完 worker 函数前就退出了。