概述
context不管大佬们怎么评价,它都是go语言的精髓所在,是一定要学会的
使用
用在并发时,管控生命周期的;通俗点说,就是goroutine的时候使用
实际例子
需求:我是一个内容网站,通过getContent方法,我获取内容推荐给用户,但是如果推荐服务超时了(不管因为什么),我就返回给用户最热的10条新闻,而不是直接返回504
package main
import (
"context"
"fmt"
"time"
)
// 这个方法的目的是,控制子调用的超时,因为整个getContent是3秒,而获取recommondContent是2秒,这2秒是包含在这3秒钟的,要做到的就是这个效果
func shrinkTimeoutContext(ctx context.Context, timeout time.Duration) (context.Context, context.CancelFunc) {
t, ok := ctx.Deadline()
if !ok {
return context.WithTimeout(ctx, timeout)
}
nt := time.Now()
if t.Before(nt) {
return context.WithTimeout(ctx, 0)
}
return context.WithDeadline(ctx, nt.Add(timeout))
}
func GetRecommendContent(ctx context.Context) string {
time.Sleep(1)
return "recommend content"
}
func GetContent(ctx context.Context) string {
rcCtx, cancel := shrinkTimeoutContext(ctx, time.Second * 2)
var res string
go func() {
res = GetRecommendContent(rcCtx)
cancel()
}()
select {
case <-rcCtx.Done():
if rcCtx.Err() == context.DeadlineExceeded {
return "ten hot news"
}
}
return res
}
func main() {
rCtx, cancel := context.WithTimeout(context.Background(), time.Second * 3)
defer cancel()
fmt.Println(GetContent(rCtx))
}
结果是打印出来是:recommend content
Go语言中Context的应用与超时控制
本文介绍了Go语言中的Context包如何用于并发场景下的生命周期管理,特别是如何通过设置超时来控制goroutine。通过示例代码展示了如何在推荐服务超时时返回默认内容,而非直接返回错误状态。在示例中,`shrinkTimeoutContext`函数用于创建一个具有缩短超时的子上下文,当`GetRecommendContent`调用超时时,返回'十热新闻',否则返回实际推荐内容。
1478

被折叠的 条评论
为什么被折叠?



