標籤:out star 函數 pac import channels 使用 print art
我們可以使用channels在多個goroutine之間進行同步(synchronize), 下面直接看例子。
例子 1, 使用chan等待一個goroutine結束。
package mainimport "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結束後運行。
package mainimport ( "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)}
go語言:一個簡單的goroutine同步(synchronize)