ajax - 在返回之前如何合并两个 gorountines 的结果?

标签 ajax http go goroutine

我在 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

playground link

如果您想要更复杂的行为,例如超时或部分结果,那么您可能希望您的子请求在您可以选择的 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)

playground Link

这并不能完全保持秩序,但如果这很重要,您可以创建另一个 channel 。无论如何,这就是一般的想法。

关于ajax - 在返回之前如何合并两个 gorountines 的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31794707/

相关文章:

javascript - 关于表单、Ajax

ajax - 如何使用桌面应用程序的测量协议(protocol)

jquery - .load() 与成功函数

c++ - 使用 winsock 库发送 GET http 请求时出现 400 bad request 错误

go - 如何获得实现 io.WriteCloser 的 bufio.Writer

javascript - 使用 UJS 动态向表添加行

http - 如何欺骗http referer

java - 不同编码的 HTTP Post 请求正文(字符集)

用于谷歌云 SQL 的 GoLang SDK

go - Go中特定接口(interface)的 slice