goroutinesync.WaitGroupgoroutine
time.Sleep() 方法
该方法其实是最简单的,但不知道为什么当时就没有想到…
func main() {
for i := 0; i < 5; i++ {
go func(i int) {
tmp := rand.Intn(10)
time.Sleep(time.Duration(tmp) * time.Second)
fmt.Println("I want to sleep ", tmp, " seconds!")
// c <- i
}(i)
}
time.Sleep(5 * time.Second)
}
这样实际上就可以完成了,主协程保证在5s后会自动退出,他的所有子协程都会跟着退出,该执行的执行,该退出的退出,就能够达到目标。
time.Ticker 方法
time.Ticker
func main() {
ticker := time.NewTicker(5 * time.Second)
c := make(chan int, 5)
for i := 0; i < 5; i++ {
go func(i int) {
tmp := rand.Intn(10)
time.Sleep(time.Duration(tmp) * time.Second)
fmt.Println("I want to sleep", tmp, "seconds!")
c <- i
}(i)
}
for {
select {
case i := <-c:
fmt.Printf("The %d goroutine is done.\n", i)
case <-ticker.C:
fmt.Println("Time to go out!")
os.Exit(5)
}
}
}
forchannelticker
selectselect
context 方法
该方法应该也是可以实现的,但是本人还在摸索阶段,具体代码先不po出来了,大家可以一起思考一下。