watigroup是用来控制一组goroutine的,用来等待一组goroutine结束

比如关于kafka的消费者代码除了生硬的让程序等待一个小时,也可以这样写

package main

import (
"sync"
"github.com/Shopify/sarama"
"strings"
"fmt"
) var wg sync.WaitGroup//用来等到一组goroutine结束 func main() {
consumer, err := sarama.NewConsumer(strings.Split("localhost:9092", ","), nil)
if err != nil {
fmt.Println("failed to start consumer:%s", err)
return
}
partitionList, err := consumer.Partitions("nginx_long")
if err != nil {
fmt.Println("failed to get the list of partitions:", err)
}
fmt.Println(partitionList)
for partition := range partitionList{
pc, err := consumer.ConsumePartition("nginx_log", int32(partition),sarama.OffsetNewest)
if err != nil {
fmt.Println("failed to start consumer for partition %d:%s\n", partition, err)
return
}
defer pc.AsyncClose()
go func(sarama.PartitionConsumer) { //kafka有几个分区就起几个goroutine
wg.Add() //
for msg := range pc.Messages(){//返回一个channel
fmt.Printf("consumer Partition:%d, Offset:%d, key:%s, value:%s", msg.Partition, msg.Offset, string(msg.Key), string(msg.Value))
fmt.Println()
}
wg.Done()
}(pc)
}
wg.Wait()
//time.Sleep(time.Hour)
consumer.Close()
}

wg.add()用来加1,wg.done()用来减1,wg.wait()用来确认收到等待信号,程序可以继续执行,对于上面的例子:

1、kafka有几个分区,程序就会启动几个goroutine,在它的匿名函数里,每新起一个goroutine,wg.add()都会被执行

2、每一个for循环结束后,wg.done()也会被执行,当wg.done()等于0时,wg.wait()收到信号,程序执行consumer.close()

[GO]关于go的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. waitGroup的使用

    package main import ( "fmt" "sync" "time" ) func main() { var wg sync. ...

  7. Go - WaitGroup

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

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

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

  9. sync—WaitGroup

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

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

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

随机推荐

  1. delphi 泛型 c++builder 泛型

    delphi 泛型 System.Generics.Collections.pas TList<T> http://docwiki.embarcadero.com/Libraries/Be ...

  2. 行矩阵列矩阵D3D&GL&U3D

    void Start () { //矩阵函数原型:Matrix4x4(Vector4 colum0, Vector4 colum1, Vector4 colum2, Vector4 colum3),这 ...

  3. __builtin__与__builtins__的区别与关系

    在学习Python时,很多人会问到__builtin__.__builtins__和builtins之间有什么关系.百度或Google一下,有很 多答案,但是这些答案要么不准确,要么只说了一点点,并不 ...

  4. 在Linux Bash通过上下键快速查找历史命令

    在centos 7中 ~/.bashrc 或者Mac中的 ~/.bash_profile 中添加,然后source一下以下内容: if [[ $- == *i* ]] then bind '" ...

  5. Eclipse 安装JavaEE插件

    Oxygen版Eclipse 导入项目会自动安装你项目需要的一些插件,但是有时候会安装失败,需要手动安装: 这里以Dynamic Web Project项目为例 打开Eclipse,依次选择Help ...

  6. 【Java】JVM(一)、Java内存区域

    一.程序计数器(Program Counter Register) 当前执行字节码的行号指示器,可以通过修改该计数器的值来实现字节码指令(分支,循环,跳转等), 每个线程都都有一个程序计数器, 属于线 ...

  7. etcd 集群恢复

    七个节点,挂了5个,etcd无法访问 参考: https://coreos.com/etcd/docs/latest/op-guide/recovery.html 此次我只恢复了v3的数据 在存活的节 ...

  8. Containerpilot 配置文件 之 Watches

    watch是在consul进行监视的服务配置. watch轮询服务的状态,并在服务变得健康,变得不健康或者实例数量发生变化时发出事件. 请注意,watch不包括行为; watch只发出事件,以便job ...

  9. Linux就业技术指导(五):Linux运维核心管理命令详解

    一,Linux核心进程管理命令 1.1 ps:查看进程 1.1.1 命令解释 功能说明 ps命令用于列出执行ps命令的那个时刻的进程快照,就像用手机给进程照了一张照片.如果想要动态地显示进程,就需要使 ...

  10. oracle,PL/SQL新建表

    创建用户 -- Create the user create user U_HQ_JAVA default tablespace USERS temporary tablespace TEMP pro ...