Go的WaitGroup
goroutine使用方便,但是如果不加以处理一般会deadlock,因为goroutine配合Chanel的话只能是一进一出,否则就会卡在那里。下面一个示例就是利用这个WaitGroup处理这种死锁。
写之前有个小地方,就是关于chan单向双向的问题。如果是我们定义了一个双向chan,它是可以传给单向chan的,反之则不可以。如果无特殊要求,我个人觉得单向chan只是在代码阅读上更准确。
var ch1 <-chan string 这个ch1就是只能写数据,比如 a := <-ch1
var ch2 chan<- string 这个ch2只能接受数据,比如 ch2 <- "aaa"
示例
package main
import "sync"
type User struct {
    Name string
}
func main() {
    result := make(chan *User)
    var waitGroup sync.WaitGroup
    var users []*User
    for i := ; i < ; i++ {
        users = append(users, &User{Name: "test"})
    }
    
  // 为100个goroutine在group中开辟“通道”
    waitGroup.Add(len(users))
    for _, feed := range users {
        go func(*User) {
            AddUser(feed, result)
        // 每个goroutine完成工作后关闭一个
            waitGroup.Done()
        }(feed)
    }
    go func() {
    // 当还未全Done时,这里会堵塞住
        waitGroup.Wait()
        close(result)
    }()
    for res := range result {
        println(res.Name)
    }
}
func AddUser(feed *User, res chan<- *User)  {
    res <- feed
}
这里输出100个test
Go的WaitGroup的更多相关文章
- Go并发控制之sync.WaitGroup
		WaitGroup 会将main goroutine阻塞直到所有的goroutine运行结束,从而达到并发控制的目的.使用方法非常简单,真心佩服创造Golang的大师们! type WaitGroup ... 
- Golang中WaitGroup使用的一点坑
		Golang中WaitGroup使用的一点坑 Golang 中的 WaitGroup 一直是同步 goroutine 的推荐实践.自己用了两年多也没遇到过什么问题.直到一天午睡后,同事扔过来一段奇怪的 ... 
- WaitGroup
		WaitGroup在go语言中,用于线程同步,单从字面意思理解,wait等待的意思,group组.团队的意思,WaitGroup就是指等待一组,等待一个系列执行完成后才会继续向下执行. 先说说Wait ... 
- [Go] Go的WaitGroup计数信号量
		WaitGroup是一个计数信号量,可以用来记录并维护运行的goroutine,如果WaitGroup的值大于0,Wait方法就会阻塞 调用Done方法来减少WaitGroup的值,并最终释放main ... 
- Go 初体验 - 并发与锁.2 - sync.WaitGroup
		sync包里的WaitGroup主要用于协程同步 计数主协程创建的子线程 WaitGoup.Add(i) 调用清除标记方法WaitGroup.Done() 使用WaitGroup.Wait()来阻塞, ... 
- waitGroup的使用
		package main import ( "fmt" "sync" "time" ) func main() { var wg sync. ... 
- Go - WaitGroup
		package main import ( "fmt" "sync" ) //WaitGroup用于等待一组线程的结束.父线程调用Add方法来设定应等待的线程的 ... 
- Go基础系列:WaitGroup用法说明
		正常情况下,新激活的goroutine的结束过程是不可控制的,唯一可以保证终止goroutine的行为是main goroutine的终止.也就是说,我们并不知道哪个goroutine什么时候结束. ... 
- sync—WaitGroup
		用途:阻塞主线程的执行,直到所有的goroutine执行完成 WaitGroup总共有三个方法:Add(delta int),Done(),Wait().简单的说一下这三个方法的作用. Add:添加或 ... 
- Go 并发控制--WaitGroup的使用
		开发过程中,经常task之间的同步问题.例如,多个子task并发完成一部分任务,主task等待他们最后结束. 在Go语言,实现同步的一种方式就是WaitGroup. Example package m ... 
随机推荐
- html input file 设置文件类型
			解决方案: 使用 input 的 accept 属性指定接受文件类型 -----------更新--------------- 之前的代码有个缺点,打开文件窗口时会自动筛选文件夹下所有符合设定类型的文 ... 
- queue的使用-Hdu 1702
			ACboy needs your help again! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ... 
- Dart语言学习(二) Dart的常量和变量
			1.使用var声明变量,可赋予不同类型的值 Dart是一个强大的脚本类语言,可以不预先定义变量类型 ,自动会类型推导 Dart中定义变量可以通过var关键字可以通过类型来申明变量 var str='t ... 
- pyqt5 通过QLinearGradient 绘制取色板
			要绘制HSV取色板,一般通过绘制前景色和背景色的方式实现,先绘制前景,然后绘制背景,前景是HSV颜色空间,从左到右,背景是亮度,从上到下,xs和ys是鼠标的当前的位置. def graphicsVie ... 
- 查看Oracle的表中有哪些索引(用user_indexes和user_ind_columns)
			用user_indexes和user_ind_columns系统表查看已经存在的索引 对于系统中已经存在的索引我们可以通过以下的两个系统视图(user_indexes和user_ind_columns ... 
- centos openoffice 的启动
			https://blog.csdn.net/resolute123/article/details/77304973 
- Java面向对象编程 -5
			代码块 在程序之中使用"{}"定义的结构就称为代码块,而后根据代码块出现的位置以及定义的关键字的不同, 代码块可以分为 普通代码块 构造代码块 静态代码块 同步代码块 其中同步代码 ... 
- cc攻击怎么防御,如何防止cc攻击?
			当我们访问一个网站时,如果网站页面越简单,访问速度越快,页面越漂亮,加载速度就越慢,因为要加载更多东西,服务器压力也会比较大.cc攻击就是利用这种弱点,使用大量代理服务器,对网站进行攻击,消耗网站服务 ... 
- 安卓之线性布局LinearLayout
			一.xml属性 (1)orientation:指定线性布局的方向 (2)gravity:指定布局内部视图与本线性布局的对齐方式 (3)layout_weight:指定当前视图的宽或高占上级 ... 
- HTML 入门第一课
			HTML 简单认识 HTML(HyperText Markup Language)即超文本标记语言,是一种用来制作超文本文档的简单标记语言,也是制作网页的最基本的语言,它可以直接由浏览器执行. 1.H ... 
