zoukankan      html  css  js  c++  java
  • Golang控制子gorutine退出,并阻塞等待所有子gorutine全部退出

    Golang控制子gorutine退出,并阻塞等待所有子gorutine全部退出

    需求

    程序有时需要自动重启或者重新初始化一些功能,就需要退出之前的所有子gorutine,并且要等待所有子gorutine全部退出,以下demo可以提供思路

    实现demo

    package main
    
    import (
    	"fmt"
    	"sync"
    	"time"
    )
    
    func main() {
    	channal1 := make(chan bool,3)
    
    	wg := new(sync.WaitGroup)
    	wg.Add(3)
    	go g1(channal1,wg)
    	go g2(channal1,wg)
    	go g3(channal1,wg)
    
    	time.Sleep(time.Second * 10)
    	channal1 <- true
    	channal1 <- true
    	channal1 <- true
    	wg.Wait()
    	fmt.Println("++++>>>>all gorutine finish...<<<<++++")
    	close(channal1)
    }
    
    func g1(c chan bool,wg *sync.WaitGroup) {
    	i := 0
    	for{
    		select {
    		case <- c:
    			fmt.Printf("@@@---->>>>>g1  end<<<<<----+++
    ")
    			wg.Done()
    			return
    		default:
    			i++
    			fmt.Printf("+++>>>>>g1  working---%d---<<<<<+++
    ",i)
    		}
    		time.Sleep(time.Second * 2)
    	}
    }
    
    func g2(c chan bool,wg *sync.WaitGroup) {
    	i := 0
    	for{
    		select {
    		case <- c:
    			fmt.Printf("@@@---->>>>>g2  end<<<<<----+++
    ")
    			wg.Done()
    			return
    		default:
    			i++
    			fmt.Printf("+++>>>>>g2  working---%d---<<<<<+++
    ",i)
    		}
    		time.Sleep(time.Second * 2)
    	}
    }
    
    func g3(c chan bool,wg *sync.WaitGroup) {
    	i := 0
    	for{
    		select {
    		case <- c:
    			fmt.Printf("@@@---->>>>>g3  end<<<<<----+++
    ")
    			wg.Done()
    			return
    		default:
    			i++
    			fmt.Printf("+++>>>>>g3  working---%d---<<<<<+++
    ",i)
    		}
    		time.Sleep(time.Second * 2)
    	}
    }
    
    

    运行结果

    +++>>>>>g2  working---1---<<<<<+++
    +++>>>>>g1  working---1---<<<<<+++
    +++>>>>>g3  working---1---<<<<<+++
    +++>>>>>g2  working---2---<<<<<+++
    +++>>>>>g1  working---2---<<<<<+++
    +++>>>>>g3  working---2---<<<<<+++
    +++>>>>>g2  working---3---<<<<<+++
    +++>>>>>g1  working---3---<<<<<+++
    +++>>>>>g3  working---3---<<<<<+++
    +++>>>>>g2  working---4---<<<<<+++
    +++>>>>>g1  working---4---<<<<<+++
    +++>>>>>g3  working---4---<<<<<+++
    +++>>>>>g2  working---5---<<<<<+++
    +++>>>>>g3  working---5---<<<<<+++
    +++>>>>>g1  working---5---<<<<<+++
    @@@---->>>>>g2  end<<<<<----+++
    @@@---->>>>>g1  end<<<<<----+++
    @@@---->>>>>g3  end<<<<<----+++
    ++++>>>>all gorutine finish...<<<<++++
    
  • 相关阅读:
    突然想写一篇有关欧拉函数的博客
    洛谷P1199 三国游戏——题解
    洛谷P1310 表达式的值——题解
    洛谷P1309 瑞士轮——题解
    洛谷P1077 摆花——题解
    size_t是什么?
    c++ bitset——一个有趣的类型
    有关文件操作的总结
    一本通&&洛谷 ——靶型数独——题解
    一本通【例题4】Addition Chains——题解
  • 原文地址:https://www.cnblogs.com/Kingram/p/12615323.html
Copyright © 2011-2022 走看看