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