zoukankan      html  css  js  c++  java
  • 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 := 0; i < 100; 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

    一个没有高级趣味的人。 email:hushui502@gmail.com
  • 相关阅读:
    关系型数据库和非关系型数据库的区别
    总结篇3-python数据结构和算法
    总结篇2-python进阶
    总结篇1-python基础
    测试sql星级判定函数
    1、Anyproxy简介
    Python内置logging模块-- 日志
    python+ selenium 绕过浏览器检测
    python-selenium,解决 遇到阿里无痕登录验证
    seldom
  • 原文地址:https://www.cnblogs.com/CherryTab/p/12374519.html
Copyright © 2011-2022 走看看