我们可以使用Channel来同步不同goroutines的执行。看下面的代码:
package main import "fmt" import "time" //这个函数会在新的goroutine中运行,执行结束时会给done channel中传入值true //注意到中间有sleep了一秒 func worker(done chan bool) { fmt.Print("working...") time.Sleep(time.Second) fmt.Println("done") //channel中传入值true done <- true } func main() { //创建一个channel,用于goroutine之间通知情况 done := make(chan bool, ) //开启goroutine,并把done channel传进去 go worker(done) //如果done channel中一直没有数据,这里就会卡住,直到worker结束时传入值以后,这里才会继续执行 <-done }
运行结果:
working...done
如果我们把main函数最后一句代码:<-done,去掉以后,不会输出任何数据。
因为主线程已经执行完退出了,goroutine依赖于主现程,也会退出。用古话说是:
皮之不存,毛將焉附?
覆巢之下,安有完卵?
国之不存,何以家为?
问题:
A主线程启动B1 B2 两个goroutine,B1 启动了C11 C12两个goroutine。如果B1执行结束,C11 C12会退出吗?
结论:不会