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 
    --------所有协程执行完毕-------------
  • 相关阅读:
    吊打XXX
    [CQOI2011]动态逆序对
    陌上花开
    【BOI2007】摩基亚Mokia
    [SCOI2008]奖励关
    最小生成树
    打表
    【中学高级本】倒酒
    整数合并
    韩信点兵
  • 原文地址:https://www.cnblogs.com/perfei/p/11634627.html
Copyright © 2011-2022 走看看