在线文档  >   Golang练习   >   通道同步

我们可以使用通道来同步在 协程 之间的执行。下面是一个使用阻塞接收等待 协程 完成的示例。当等待多个 协程 完成时,您可能更喜欢使用 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启动之前退出。