2 回答
TA贡献1786条经验 获得超13个赞
对于简单的事情,我会使用一组局部变量和一些设置这些变量的 goroutine,以及一个等待组来了解一切何时完成:
var a string
var b string
wg := sync.WaitGroup{}
wg.Add(2)
go func(){
time.Sleep(5 * time.Second) // make a request
a = "foo"
wg.Done()
}()
go func(){
time.Sleep(3 * time.Second) // make a request
b = "bar"
wg.Done()
}()
wg.Wait()
fmt.Println(a,b) //combine results
如果您想要更复杂的行为,如超时或部分结果,那么您可能希望您的子请求在您可以选择的频道上传达结果:
// make sure to buffer to max number of senders so garbage collection can clean up
// if we time out
ch := make(chan string, 2)
go func() {
time.Sleep(5 * time.Second) // make a request
ch <- "foo"
}()
go func() {
time.Sleep(2 * time.Second) // make a request
ch <- "bar"
}()
results := []string{}
timeout := time.After(4 * time.Second)
Loop:
for {
select {
case r := <-ch:
results = append(results, r)
if len(results) == 2 {
break Loop
}
case <-timeout:
break Loop
}
}
fmt.Println(results)
这并不能完全保留顺序,但如果这很重要,您可以创建另一个频道。无论如何,这就是一般的想法。
- 2 回答
- 0 关注
- 180 浏览
添加回答
举报