chan应用:

go实现主线程等待子线程都运行完再退出

方式1:


package main
import (
	"fmt"
)
func main() {
	ch := make(chan struct{})
	count := 2 // count 表示活动的协程个数
	go func() {
		fmt.Println("Goroutine 1")
		ch <- struct{}{} // 协程结束,发出信号
	}()
	go func() {
		fmt.Println("Goroutine 2")
		ch <- struct{}{} // 协程结束,发出信号
	}()
	for range ch {
		// 每次从ch中接收数据,表明一个活动的协程结束
		count--
		// 当所有活动的协程都结束时,关闭管道
		if count == 0 {
			close(ch)
		}
	}
}

方式2:

package main
 import (
   "fmt"
  "sync"
 )
 func main() {
  var wg sync.WaitGroup
  wg.Add(2) // 因为有两个动作,所以增加2个计数
  go func() {
    fmt.Println("Goroutine 1")
    wg.Done() // 操作完成,减少一个计数
  }()
  go func() {
    fmt.Println("Goroutine 2")
    wg.Done() // 操作完成,减少一个计数
  }()
  wg.Wait() // 等待,直到计数为0
}

 

上一篇:Go 面试每天一篇(第 37 天)


下一篇:Go学习日记15