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出来了,大家可以一起思考一下。