Go channel如何控制goroutine并发执行顺序?

参考解析

**多个goroutine并发执行时,每一个goroutine抢到处理器的时间点不一致,gorouine的执行本身不能保证顺序。**即代码中先写的gorouine并不能保证先执行

思路:使用channel进行通信通知,用channel去传递信息,从而控制并发执行顺序

  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. "time"
  6. )
  7. var wg sync.WaitGroup
  8. func main() {
  9. ch1 := make(chan struct{}, 1)
  10. ch2 := make(chan struct{}, 1)
  11. ch3 := make(chan struct{}, 1)
  12. ch1 <- struct{}{}
  13. wg.Add(3)
  14. start := time.Now().Unix()
  15. go print("gorouine1", ch1, ch2)
  16. go print("gorouine2", ch2, ch3)
  17. go print("gorouine3", ch3, ch1)
  18. wg.Wait()
  19. end := time.Now().Unix()
  20. fmt.Printf("duration:%d
  21. ", end-start)
  22. }
  23. func print(gorouine string, inputchan chan struct{}, outchan chan struct{}) {
  24. // 模拟内部操作耗时
  25. time.Sleep(1 * time.Second)
  26. select {
  27. case <-inputchan:
  28. fmt.Printf("%s
  29. ", gorouine)
  30. outchan <- struct{}{}
  31. }
  32. wg.Done()
  33. }
  • 输出:

    gorouine1 gorouine2 gorouine3 duration:1