zoukankan      html  css  js  c++  java
  • 3.2 go WaitGroup代码示例

    sync.WaitGroup提供了一种安全的多协程处理方法,内部使用race、atomic来处理,避免了资源竞争及锁的产生。

    主要的方法有Add、Done、Wait,可以等待一组协程全部执行完毕后,主程序才继续往下执行。

    代码示例:

    package main
    
    import(
    	"fmt"
    	"math/rand"
    	"sync"
    	"time"
    )
    
    type Worker struct {
    	In chan int
    	Done func()
    }
    
    func (wk *Worker) Do1(seq int){
    	for n := range wk.In {
    		time.Sleep(time.Duration(rand.Intn(1000))*time.Millisecond)
    		fmt.Printf("number %d res : %d 
    ", seq, n)
    		wk.Done()
    	}
    }
    
    
    func createWorker(seq int, wg *sync.WaitGroup) Worker{
    	wk := Worker{
    		In: make(chan int),
    		Done: func(){
    			wg.Done()
    		},
    	}
    	go wk.Do1(seq)
    	return wk
    }
    
    func test1(){
    	var wg sync.WaitGroup
    	var wks [8]Worker
    	wg.Add(16)
    	fmt.Println("-----------协程开始执行---------------- ")
    	for i:=0;i<8;i++{
    		wks[i] = createWorker(i,&wg)
    	}
    	
    	for i:=0;i<8;i++{
    		wks[i].In <- i
    	}
    	
    	for i:=0;i<8;i++{
    		wks[i].In <- 100 + i
    	}
    	
    	wg.Wait()
    	fmt.Println("--------所有协程执行完毕------------- ")
    }
    
    
    
    func main(){
    	test1()
    }

    输出结果

    -----------协程开始执行---------------- 
    number 2 res : 2 
    number 0 res : 0 
    number 3 res : 3 
    number 4 res : 4 
    number 5 res : 5 
    number 0 res : 100 
    number 6 res : 6 
    number 1 res : 1 
    number 7 res : 7 
    number 4 res : 104 
    number 3 res : 103 
    number 1 res : 101 
    number 7 res : 107 
    number 2 res : 102 
    number 6 res : 106 
    number 5 res : 105 
    --------所有协程执行完毕-------------
  • 相关阅读:
    websocket协议
    vue组件之间的传值
    vue中非父子组件的传值bus的使用
    $.proxy的使用
    弹性盒模型display:flex
    箭头函数与普通函数的区别
    粘贴到Excel的图片总是有些轻微变形
    centos rhel 中文输入法的安装
    vi ,默认为 .asm .inc 采用nasm的语法高亮
    how-to-convert-ppk-key-to-openssh-key-under-linux
  • 原文地址:https://www.cnblogs.com/perfei/p/11634627.html
Copyright © 2011-2022 走看看