Go多个协程实现顺序打印
WaitGroup + 无缓冲channel
- waitgroup 用来生成n个协程
-
- Add() 、Done()、Wait()
- channel用来实现信号的传递从未实现同步阻塞,确保协程顺序执行
package mainimport ("fmt""sync""time"
)func main() {n := 200ch := make(chan bool) //创建一个无缓冲的channel实现同步阻塞var wg sync.WaitGroupwg.Add((n))for i := 1; i <= n; i++ {go func(n int) {defer wg.Done() //协程结束时减少waitgroup记数time.Sleep(time.Duration(n) * time.Second) //模拟耗时操作fmt.Println("output:", n)ch <- true //发送信号量到channel}(i)}for i := 1; i <= n; i++ {<-ch //等待信号,确保按序打印fmt.Println("按照顺序打印:", i)}wg.Wait() //等待所有的协程执行完成
}