• 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
  • 相关阅读:
    处理sevenzipsharp 检查密码函数的Bug
    C# 开源压缩组件比较
    css 一些技巧
    input 限制输入
    原生JS实现淡入淡出效果(fadeIn/fadeOut/fadeTo)
    js string.format 方法
    Atom插件及使用
    chrome浏览器的跨域设置-包括版本49前后两种设置 ,windows&mac
    原生js监听input值改变事件
    html5 tab横向滚动,无滚动条(transform:translate)
  • 原文地址:https://www.cnblogs.com/CherryTab/p/12374519.html
Copyright © 2020-2023  润新知