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\n")
} // 如果定义的不是全局的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\n", input)
}
fmt.Printf("get data exited\n")
// 使用 waitGroup给出goroutine的结束信号
waitGroup.Done()
} func getData2(ch chan string, waitGroup *sync.WaitGroup) {
for {
input2, ok := <-ch
if !ok {
break
}
fmt.Printf("getData2中的input值:%s\n", input2)
}
fmt.Printf("get data2 exited\n")
// 使用 waitGroup给出goroutine的结束信号
waitGroup.Done()
}

waitGroup的使用的更多相关文章

  1. Go并发控制之sync.WaitGroup

    WaitGroup 会将main goroutine阻塞直到所有的goroutine运行结束,从而达到并发控制的目的.使用方法非常简单,真心佩服创造Golang的大师们! type WaitGroup ...

  2. Golang中WaitGroup使用的一点坑

    Golang中WaitGroup使用的一点坑 Golang 中的 WaitGroup 一直是同步 goroutine 的推荐实践.自己用了两年多也没遇到过什么问题.直到一天午睡后,同事扔过来一段奇怪的 ...

  3. WaitGroup

    WaitGroup在go语言中,用于线程同步,单从字面意思理解,wait等待的意思,group组.团队的意思,WaitGroup就是指等待一组,等待一个系列执行完成后才会继续向下执行. 先说说Wait ...

  4. [Go] Go的WaitGroup计数信号量

    WaitGroup是一个计数信号量,可以用来记录并维护运行的goroutine,如果WaitGroup的值大于0,Wait方法就会阻塞 调用Done方法来减少WaitGroup的值,并最终释放main ...

  5. Go 初体验 - 并发与锁.2 - sync.WaitGroup

    sync包里的WaitGroup主要用于协程同步 计数主协程创建的子线程 WaitGoup.Add(i) 调用清除标记方法WaitGroup.Done() 使用WaitGroup.Wait()来阻塞, ...

  6. Go - WaitGroup

    package main import ( "fmt" "sync" ) //WaitGroup用于等待一组线程的结束.父线程调用Add方法来设定应等待的线程的 ...

  7. Go基础系列:WaitGroup用法说明

    正常情况下,新激活的goroutine的结束过程是不可控制的,唯一可以保证终止goroutine的行为是main goroutine的终止.也就是说,我们并不知道哪个goroutine什么时候结束. ...

  8. sync—WaitGroup

    用途:阻塞主线程的执行,直到所有的goroutine执行完成 WaitGroup总共有三个方法:Add(delta int),Done(),Wait().简单的说一下这三个方法的作用. Add:添加或 ...

  9. Go 并发控制--WaitGroup的使用

    开发过程中,经常task之间的同步问题.例如,多个子task并发完成一部分任务,主task等待他们最后结束. 在Go语言,实现同步的一种方式就是WaitGroup. Example package m ...

随机推荐

  1. springboot缓存注解——@Cacheable

    @Cacheable: 1,方法运行之前,先查询Cache(缓存组件),按照cacheName指定的名字获取(CacheManager获取相应缓存) 第一次获取缓存如果没有Cache组件会自会自动创建 ...

  2. [Windows] 重新安装/卸载桌面版OneDrive / Reinstall/ Uninstall Desktop Version OneDrive

    Deep within the OS is a backup copy of the OneDriver installer. To find it, go to  File Explorer> ...

  3. Lua完全自学手册(图文教程)

    Programming in Lua程序设计   http://book.luaer.cn/ Lua完全自学手册(图文教程) https://edu.aliyun.com/course/506/les ...

  4. python爬取某站磁力链

    不同磁力链网站网页内容都不同,需要定制 1,并发爬取 并发爬取后,好像一会就被封了 import requests from lxml import etree import re from conc ...

  5. python3 LDA主题模型以及TFIDF实现

    import codecs #主题模型 from gensim import corpora from gensim.models import LdaModel from gensim import ...

  6. JSP动作标签flush属性值

    在JSP动作标签<jsp:include flush="true"/>,flush属性可以为true或false.flush默认值为false,当把flush属性赋值为 ...

  7. PDF 补丁丁 0.6.0.3288 版发布(修复“合并文件”功能的文件夹文件排序问题)

    新的测试版修复了合并文件功能中添加名称带有“.”点号的文件夹时无法正常排序文件的问题. 使用合并文件功能的用户建议更新.

  8. 跟随我在oracle学习php(11)

    数组专题 数组遍历: 1,普通for循环,经常用的数组遍历 var arr = [1,2,0,3,9]; for ( var i = 0; i <arr.length; i++){ consol ...

  9. java-猜数字

    package com.jijy.circle; import java.util.Scanner; import java.util.Random; public class demo5 { pub ...

  10. Python-接口自动化(四)

    python基础知识(四) (四)处理文件 a.文件的格式主要有txt.html.xml,接下来主要讲的是txt格式的文件处理 对文件进行读写等操作会用到的函数是open(),第一个参数file是指传 ...