如golang doc中所述,sync是低级库例程的意图。
除了Once和WaitGroup类型之外,大多数都是打算使用的 低级库例程。更高级别的同步更好 通过渠道和沟通完成。
我不太了解这个陈述,我使用同步,如下例所示
我的目的只是让主线程等到所有其他线程完成,类似于c ++线程库中的.join()
。
问题:
1:这样使用同步是否合适?或者我应该使用频道而不是同步?
2:频道和同步有什么区别?
var wg sync.WaitGroup // declare the variable globally
func send(a string, b string){
defer wg.Done()
// do something
}
func main(){
for i:=0; i<50; i++ {
wg.Add(1) // add delta
go send("1111", "2222")
}
wg.Wait() // wait until wg becomes 0
}
任何建议都表示赞赏!谢谢!
答案 0 :(得分:0)
此示例可以帮助您
var wg sync.WaitGroup
done := make(chan bool)
for _, element := range slice {
wg.Add(1)
go func(elem interface{}) {
wg.Done()
}(element)
}
go func() {
wg.Wait()
done <- true
}()
for {
select {
case done:
fmt.Println("All goroutines completed")
close(done)
return
case time.After(time.Minute * 2):
fmt.Println("Timeout!")
return
}
}
答案 1 :(得分:0)
我不知道它是否合适,但下面的代码可以在不使用较低级别“同步”的情况下完成。
package main
func send(a string, b string, c chan bool) {
// println( a, b )
c <- true;
}
func
main() {
c := make( chan bool )
for i:=0; i<50; i++ {
go send("1111", "2222", c)
}
w := 0
for _ = range c {
w += 1
if w == 50 { break }
}
}