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

posted @ 2020-02-27 21:28  zhangyu63  阅读(150)  评论(0编辑  收藏  举报