zoukankan      html  css  js  c++  java
  • Go语言协程并发---等待组sync.WaitGroup

    package main
    
    import (
    	"fmt"
    	"sync"
    	"time"
    )
    
    /*等待组API介绍*/
    func main071() {
    	var wg sync.WaitGroup
    	fmt.Println(wg)
    
    	//向等待组添加一个协程(注册)
    	wg.Add(1)
    
    	//从等待组减掉一个协程(注销)
    	wg.Done()
    
    	//阻塞等待至等待组中的协程数归零
    	wg.Wait()
    }
    
    /*
    ·分别使用Ticker和Timer创建耗时协程A,B
    ·将A,B,C两个协程加入等待组
    ·A,B,C结束时从等待组注销
    ·主协程阻塞至等待组内协程数归零
    */
    
    func main() {
    	//声明等待组
    	var wg sync.WaitGroup
    
    	//每开辟一个协程就向等待组中+1
    	wg.Add(1)
    	go func() {
    		fmt.Println("协程A开始工作")
    		time.Sleep(3 * time.Second)
    		fmt.Println("协程A over")
    
    		//协程结束,从等待组中注销(协程数-1)
    		wg.Done()
    	}()
    
    	//每开辟一个协程就向等待组中+1
    	wg.Add(1)
    	go func() {
    		fmt.Println("协程B开始工作")
    		//timer := time.NewTimer(3 * time.Second)
    		//<- timer.C
    		<-time.After(5 * time.Second)
    		fmt.Println("协程B over")
    
    		//协程结束,从等待组中注销(协程数-1)
    		wg.Done()
    	}()
    
    	//每开辟一个协程就向等待组中+1
    	wg.Add(1)
    	go func() {
    		fmt.Println("协程C开始工作")
    		ticker := time.NewTicker(time.Second)
    		for i := 0; i < 4; i++ {
    			<-ticker.C
    		}
    		ticker.Stop()
    		fmt.Println("协程C over")
    
    		//协程结束,从等待组中注销(协程数-1)
    		wg.Done()
    	}()
    
    	//阻塞等待wg中的协程数归零
    	wg.Wait()
    	fmt.Println("main over")
    }
    

      

  • 相关阅读:
    变量的作用域
    内联函数inline
    数组、函数和指针
    关于android:configChanges的属性的简介
    Android 更新UI的两种方法
    android开发两种退出程序方式
    google内购In-App Billing
    谷歌登陆sdk对接
    openssl测试版本小工具
    关于facebook登陆不安装openssl的情况下怎么获得Facebook Key Hash的简单方法
  • 原文地址:https://www.cnblogs.com/yunweiqiang/p/12770923.html
Copyright © 2011-2022 走看看