gpt4 book ai didi

go - 我们是否应该为每个异步请求运行一个 goroutine,即使它们是相互产生的?

转载 作者:数据小太阳 更新时间:2023-10-29 03:13:42 26 4
gpt4 key购买 nike

我正在用 go 开发一个 web 应用程序,我知道在 http 包中,每个请求都在一个单独的 goroutine 中运行。现在,如果这个 goroutine 中的代码查询数据库然后等待并使用 db result 调用远程 api 来获取一些相关数据等等,我应该在单独的 goroutine 中运行这些调用中的每一个还是 http 提供的调用是够了吗?

最佳答案

这取决于你在做什么。

每个 HTTP 请求都应该按顺序处理。也就是说,您不应该触发 goroutine 来处理请求本身:

func myHandler(w http.ResponseWriter, r *http.Request) {
go func(w http.ResponseWriter, r *http.Request) {
// There's no advantage to this
}(w,r)
}

但是,在处理 HTTP 响应时,goroutines 仍然有很多时候是有意义的。最常见的两种情况大概是:

  1. 您想并行执行某些操作。

    func myHandler(w http.ResponseWriter, r *http.Request) {
    wg := &sync.WaitGroup{}
    wg.Add(2)
    go func() {
    defer wg.Done()
    /* query a remote API */
    }()
    go func() {
    defer wg.Done()
    /* query a database */
    }()
    wg.Wait()
    // finish handling the response
    }
  2. 您希望在响应 HTTP 请求后完成一些处理,以便 Web 客户端不必等待。

    func myHandler(w http.ResponseWriter, r *http.Request) {
    // handle request
    w.Write( ... )
    go func() {
    // Log the request, and send an email
    }()
    }

关于go - 我们是否应该为每个异步请求运行一个 goroutine,即使它们是相互产生的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43692778/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com