Golang 'defer' 导致发送(接收)API 响应延迟
Golang 'defer' causing delay in sending(receiving) API response
我创建了一个 API,它在处理完请求后发送一个响应并启动一个记录一些消息的后台 goroutine。在 API 请求被处理后,我使用 'defer' 来执行 goroutine。
以下是代码片段:
发送响应伪代码:
{
...
res.Header().Add("Content-Type", "application/json")
json.NewEncoder(res).Encode(response)
}
响应结构:
type Response struct {
StatusCode int16 `json:"statusCode"`
Message string `json:"message"`
}
API正文:
{
...
defer logMsgs()
sendAPIResponse()
return
}
logMsgs 伪代码:
func logMsgs(){
time.Sleep(10*time.Seconds)
wg := sync.Waitgroup{}
wg.Add(1)
go func(){
for i = 1 to 10
print(i)
wg.Done()
}()
wg.Wait()
}
预期结果是收到 API 响应,几秒后(这里是 10 秒)'i' 的值从 1 打印到 10。
但在实际结果中,API 10 秒后收到响应。
根据我的理解,延迟函数是在周围(或 current/enclosing)函数终止或 returns.
之后调用的
所以我必须首先收到 API 响应,然后必须记录 'i' 的值。但就我而言,我在几秒钟(10 秒)过去后收到了回复。如果 'i' 的值非常大,这将是一个主要问题。
如果有人解释这种异常行为并提供可能的解决方案,将会很有帮助。
谢谢
I have used 'defer' to execute goroutine after the API request has been handled.
defer
不启动 goroutine。它在调用 goroutine 上执行延迟函数。并且很可能响应被缓存并且写入它的数据不会被刷新,直到你从你的处理程序中 return。
如果要在新的 goroutine 中执行日志记录,请使用 go
关键字,如下所示:
defer func() {
go logMsgs()
}()
sendAPIResponse()
return
但是请注意,在从处理程序 returning 之后,启动的 goroutines 无法访问请求和响应特定对象,因为它们可能会被新请求重用。因此,保存/传递记录器需要的所有内容,以便在从处理程序 returning 后安全地使用它们。
我创建了一个 API,它在处理完请求后发送一个响应并启动一个记录一些消息的后台 goroutine。在 API 请求被处理后,我使用 'defer' 来执行 goroutine。
以下是代码片段:
发送响应伪代码:
{
...
res.Header().Add("Content-Type", "application/json")
json.NewEncoder(res).Encode(response)
}
响应结构:
type Response struct {
StatusCode int16 `json:"statusCode"`
Message string `json:"message"`
}
API正文:
{
...
defer logMsgs()
sendAPIResponse()
return
}
logMsgs 伪代码:
func logMsgs(){
time.Sleep(10*time.Seconds)
wg := sync.Waitgroup{}
wg.Add(1)
go func(){
for i = 1 to 10
print(i)
wg.Done()
}()
wg.Wait()
}
预期结果是收到 API 响应,几秒后(这里是 10 秒)'i' 的值从 1 打印到 10。
但在实际结果中,API 10 秒后收到响应。
根据我的理解,延迟函数是在周围(或 current/enclosing)函数终止或 returns.
之后调用的所以我必须首先收到 API 响应,然后必须记录 'i' 的值。但就我而言,我在几秒钟(10 秒)过去后收到了回复。如果 'i' 的值非常大,这将是一个主要问题。
如果有人解释这种异常行为并提供可能的解决方案,将会很有帮助。 谢谢
I have used 'defer' to execute goroutine after the API request has been handled.
defer
不启动 goroutine。它在调用 goroutine 上执行延迟函数。并且很可能响应被缓存并且写入它的数据不会被刷新,直到你从你的处理程序中 return。
如果要在新的 goroutine 中执行日志记录,请使用 go
关键字,如下所示:
defer func() {
go logMsgs()
}()
sendAPIResponse()
return
但是请注意,在从处理程序 returning 之后,启动的 goroutines 无法访问请求和响应特定对象,因为它们可能会被新请求重用。因此,保存/传递记录器需要的所有内容,以便在从处理程序 returning 后安全地使用它们。