Golang 在尝试使方法并发时没有任何返回



我有一个从数据库返回 Json 并且它工作正常的方法,但是当我尝试使其并发时,它不会返回任何内容,也不会给出任何错误。例如,这是正常工作的方法

func Listing_Expiration(w http.ResponseWriter, r *http.Request)  {
        db,err := sql.Open("DB_Connect")
        if err != nil {
            log.Fatal(err)
            println(err)
        }

        var result string
        errr := db.QueryRow("select json_build_object('Expiration', array_to_json(array_agg(t))) from (select fullname,ad_end from profiles where id=32)t").Scan(&result)

        defer db.Close()
        switch {
        case errr != nil:
            log.Fatal(errr)

        }

        fmt.Fprintf(w,result)
}

上述方法工作正常,数据返回到浏览器,然后我尝试使此方法异步

 func Listing_Expiration(w http.ResponseWriter, r *http.Request)  {
        go func(){
            db,err := sql.Open("DB_Connect")
            if err != nil {
                log.Fatal(err)
                println(err)
            }

            var result string
            errr := db.QueryRow("select json_build_object('Expiration', array_to_json(array_agg(t))) from (select fullname,ad_end from profiles where id=32)t").Scan(&result)

            defer db.Close()
            switch {
            case errr != nil:
                log.Fatal(errr)

            }

            fmt.Fprintf(w,result)
        }()
    }

上面的异步不返回任何内容,我唯一更改的是我在方法中添加了 Go func(),以便它是异步的,其他一切都是一样的。我检查了一下,数据库返回了相同的内容,只是不知道为什么异步没有将结果打印回浏览器。

当处理程序返回时,net/http 服务器完成响应。处理程序返回后写入响应的任何内容都将被忽略。

Listing_Expiration在匿名函数执行fmt.Fprintf(w,result)之前返回的处理程序函数。

要解决此问题,请使用同步。服务组:

func Listing_Expiration(w http.ResponseWriter, r *http.Request)  {
  var wg sync.WaitGroup
  wg.Add(1)
  go func(){
    defer wg.Done()
    // same code here as in question
  }()
  wg.Wait()
}

net/http 服务器为每个连接启动一个 goroutine,并在这些 goroutines 中运行处理程序。如果问题中的代码是完整的处理程序,那么就没有理由启动另一个 goroutine。

最新更新