
您不会将两个已启动的goroutine 彼此
同步,因此无法保证它们以什么顺序运行。您唯一要同步的是等待其他2个完成的主要goroutine,但是它们的顺序是不确定的。
这是一个使用另一个同步订单的示例
sync.WaitGroup:
w := &sync.WaitGroup{}w.Add(2)w2 := &sync.WaitGroup{}w2.Add(1)go func() { fmt.Println("1") w.Done() w2.Done()}()go func() { w2.Wait() fmt.Println("2") w.Done()}()w.Wait()输出将是(在Go Playground上尝试):
12
基本上,第二个goroutine等待
w2,一旦完成,它就会在第一个goroutine中调用。
请注意,由于第二个goroutine等待第一个goroutine,所以只需要等待第二个goroutine就可以了(传递式地等待这两个)。所以上面的例子可以这样写:
w2 := &sync.WaitGroup{}w2.Add(1)go func() { fmt.Println("1") w2.Done()}()w := &sync.WaitGroup{}w.Add(1)go func() { w2.Wait() fmt.Println("2") w.Done()}()w.Wait()输出是相同的。在Go Playground上尝试一下。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)