zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    POJ 1185 炮兵阵地 经典的 状态压缩dp
    hdu 1565 方格取数(1) 状态压缩dp
    poj Corn Fields 状态压缩dp。
    fzu 2138 久违的月赛之一 容斥。
    fzu 2136 取糖果 好几种方法解决。
    hdu 1231 最大连续子序列
    选择排序
    SharedPrefernces使用实例讲解
    SharedPrefernces使用实例讲解
    可以ping通,但是不能connect
  • 原文地址:https://www.cnblogs.com/shuchengyi/p/11409320.html
Copyright © 2011-2022 走看看