• 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...<<<<++++
    
  • 相关阅读:
    IE7 下父元素及子元素的隐藏顺序带来的 display:none bug
    PHP 类的魔术方法及类的自动加载
    元素及文本的居中
    软件工程个人作业 词频统计
    读书笔记——《最后期限》
    读书笔记——《构建之法》
    [Reading] Asking while Reading
    【Paper Reading】Learning while Reading
    Android学习一:文件操作
    Android学习九:屏幕自适应
  • 原文地址:https://www.cnblogs.com/Kingram/p/12615323.html
Copyright © 2020-2023  润新知