我在 Go 应用程序中有一个 Web 请求处理程序,需要向其他 URL 发出 2+ 个请求。我想从每个 URL 收集结果,将每个结果合并到一个 JSON 对象中,然后通过我的请求处理程序返回。这些请求彼此不依赖,不需要排序。
在 Go 中执行此操作的最佳模式是什么?我应该使用 channel 和 WaitGroup
吗?
最佳答案
对于简单的事情,我会使用一组局部变量和一些设置这些变量的 goroutine,以及一个 WaitGroup 来知道什么时候一切都完成了:
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
如果您想要更复杂的行为,例如超时或部分结果,那么您可能希望您的子请求在您可以选择的 channel 上传达结果:
// 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)
这并不能完全保持秩序,但如果这很重要,您可以创建另一个 channel 。无论如何,这就是一般的想法。
关于ajax - 在返回之前如何合并两个 gorountines 的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31794707/