zoukankan      html  css  js  c++  java
  • waitGroup的使用

    package main
    
    import (
    	"fmt"
    	"sync"
    	"time"
    )
    
    func main() {
    	var wg sync.WaitGroup
    	//一个没有缓冲区的chan
    	ch := make(chan string)
    	wg.Add(3)
    	go sendData(ch, &wg)
    	go getData(ch, &wg)
    	go getData2(ch, &wg)
    
    	// 等待所有的goroutine都执行完成后才关闭主线程
    	time.Sleep(time.Second*3)
    	wg.Wait()
    	fmt.Printf("main goroutine exited
    ")
    }
    
    // 如果定义的不是全局的wait group,则在传值的时候需要传指针类型
    func sendData(ch chan string, waitGroup *sync.WaitGroup) {
    	ch <- "aaa"
    	ch <- "bbb"
    	ch <- "ccc"
    	ch <- "ddd"
    	ch <- "eee"
    
    	// 关闭chan,即使使用了 waitGroup也需要关闭channel
    	// waitGroup只是用于主线程等待goroutine执行完毕
    	// channel是一个队列,用于多个goroutine的通讯
    	close(ch)
    	fmt.Printf("send data exited")
    	// 使用 waitGroup给出goroutine的结束信号
    	waitGroup.Done()
    }
    
    //
    func getData(ch chan string, waitGroup *sync.WaitGroup) {
    	for {
    		input, ok := <-ch
    		if !ok {
    			break
    		}
    		fmt.Printf("getData中的input值: %s
    ", input)
    	}
    	fmt.Printf("get data exited
    ")
    	// 使用 waitGroup给出goroutine的结束信号
    	waitGroup.Done()
    }
    
    func getData2(ch chan string, waitGroup *sync.WaitGroup) {
    	for {
    		input2, ok := <-ch
    		if !ok {
    			break
    		}
    		fmt.Printf("getData2中的input值:%s
    ", input2)
    	}
    	fmt.Printf("get data2 exited
    ")
    	// 使用 waitGroup给出goroutine的结束信号
    	waitGroup.Done()
    }
    
  • 相关阅读:
    Go语言基础之切片
    Go语言基础之map
    Go语言基础之函数
    Go语言基础之指针
    Go语言基础之结构体
    Redis缓存失效策略
    redis 的过期策略都有哪些?内存淘汰机制都有哪些?
    关于redis的主从、哨兵、集群
    Redis的 RDB和 AOF持久化的区别
    为什么做分布式使用 Redis
  • 原文地址:https://www.cnblogs.com/Csir/p/9857483.html
Copyright © 2011-2022 走看看