gpt4 book ai didi

go - context.Err() 完成

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

我正在对我的服务器进行多次 RPC 调用,处理程序如下所示:

func (h *handler) GetData(ctx context.Context, request Payload) (*Data, error) {

go func(ctx context.Context) {
for {
test := 0
select {
case <-ctx.Done():
if ctx.Err() == context.Canceled {
log.Info(ctx.Err())
test = 1
break
}
}
if test == 1 {
break
}
}
}(ctx)

data := fetchData(request)
return data, nil
}

fetchData API 需要大约 5 秒来获取数据并回复我的服务。同时,如果客户端再次请求,那么我将中止旧请求并触发新请求。中止在上下文对象上不可见。

相反,ctx.Err() 显示 context.Canceled 的值,即使调用未取消并以预期数据正常结束也是如此。

我是 Go 新手,不了解上下文究竟如何管理取消、超时和完成。

对行为的一些了解会有所帮助。

最佳答案

来自docs (强调我的):

For incoming server requests, the context is canceled when the client's connection closes, the request is canceled (with HTTP/2), or when the ServeHTTP method returns.

换句话说,取消并不一定意味着客户端中止了请求。

可以取消的上下文must be canceled eventually ,并且 HTTP 服务器负责:

Canceling this context releases resources associated with it, so code should call cancel as soon as the operations running in this Context complete.

您观察到的效果符合预期。

关于go - context.Err() 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49794042/

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