• 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
    
  • 相关阅读:
    react组件销毁中清理异步操作和取消请求
    只要一行代码,实现五种 CSS 经典布局
    vue中如何安装sass,sass安装命令
    每日总结
    每日总结
    每日总结
    每周总结
    每日总结
    每日总结
    每日总结
  • 原文地址:https://www.cnblogs.com/shuchengyi/p/11409320.html
Copyright © 2020-2023  润新知