咱們可使用channels在多個goroutine之間進行同步(synchronize), 下面直接看例子。
例子 1, 使用chan等待一個goroutine結束。函數
package main import "fmt" import "time" //在這定義一個函數,以goroutine的方式運行。使用done這個chan來通知 //其它的函數本函數的工做已成。這個例子是通知main函數。 func worker(done chan bool) { fmt.Print("working...") for i:=0;i<10;i++ { time.Sleep(time.Second) fmt.Print(".") } fmt.Println("done") // 函數結束時,給chan賦值 done <- true } func main() { // Start a worker goroutine, giving it the channel to // notify on. //啓動一個goroutine並給傳入一個chan c := make(chan bool, 1) go worker(c) // main函數在沒有收到chan的值時會一直block. <-c //若是沒有這句, mai函數會當即退出而不會等待worker }
例子2, 函數B在 函數A結束後運行。code
package main import ( "fmt" "time" ) //定義函數A,以goroutine的方式運行 func workerA(done chan bool){ fmt.Print("A is running") for i:=0;i<10;i++{ fmt.Print(".") time.Sleep(1 * time.Second) } fmt.Println("done") done <- true } //定義函數B,以gortoutine的方式運行 func workerB(){ fmt.Print("B is running") for i:=0;i<10;i++{ fmt.Print(".") time.Sleep(1 * time.Second) } fmt.Println("done") } func main(){ c:= make(chan bool, 1) //啓動A,傳入chan c go workerA(c) //只有A運行結束時,B才能運行 select { case <-c: go workerB() //fmt.Println("B is done !") } // wait for workerB exit. // 爲防止main函數在B以前退出,等待一段時間。 time.Sleep(20*time.Second) }