golang中如何监控多个goroute协程是否执行完成

golang中如何监控多个goroute协程是否执行完成

package main

import (
	"fmt"
)

// 将intchan管道中的素数插入到管道resultchan中,协程完成关闭时在exitchan中记录一次
func calc(intchan, resultchan, exitchan chan int) {
	for v := range intchan {
		flag := true
		for i := 2; i < v && flag == true; i++ {
			if v%i == 0 {
				flag = false
				break
			}
		}
		if flag {
			fmt.Println(v, "is 素数")
			resultchan <- v
		}
	}
	exitchan <- 1  // 记录协程管斌
}

func main() {
	var (
		IntChan    = make(chan int, 1000)
		ResultChan = make(chan int, 1000)
		ExitChan   = make(chan int, 8)
	)

	for i := 0; i < 100; i++ {
		IntChan <- i
	}
	close(IntChan)

	for i := 0; i < 8; i++ {  // 总共开了8个goroute
		go calc(IntChan, ResultChan, ExitChan)
	}

	go func() {
		for i := 0; i < 8; i++ {  // 从exitchan管道中获取到8次goroute完成完毕记录才放行
			a := <-ExitChan // 没有记录的话会堵塞,会等下次的记录被插入才会放行
		}
		close(ResultChan)  // 8此循环结束代表8个收集素数的goroute全部完成完毕了,此时才能关闭resultchan,为的是让下面for循环取完resultchan管道中值的时可以正常退出
	}()

	for v := range ResultChan {
		fmt.Println(v)
	}
}
// 0-100的所有素数
0
1
2
5
7
11
13
17
3
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
原文地址:https://www.cnblogs.com/shuchengyi/p/11409320.html