您现在的位置是:热点 >>正文
细数 Context 使用场景
热点7842217人已围观
简介...
你好,我是四哥。
前一篇文章从源码的角度详细介绍了 Context 的实现原理,但是还没有提到 Context 的使用场景,今天我们一起来看下:
1.请求链路传值。
传值使用方式如下:
func func1(ctx context.Context) {
ctx = context.WithValue(ctx, "k1", "v1")
func2(ctx)
}
func func2(ctx context.Context) {
fmt.P细数rintln("func2:",ctx.Value("k1").(string))
ctx = context.WithValue(ctx, "k2", "v2")
func3(ctx)
}
func func3(ctx context.Context) {
fmt.Println("func3:",ctx.Value("k1").(string))
fmt.Println("func3:",ctx.Value("k2").(str Cing))
}
func main() {
ctx := context.Background()
func1(ctx)
}
我们在 func1() 通过函数 WithValue() 设置了一个键值对 k1-v1,在 func2() 可以获取到 func1() 设置的键值对,如果调用 func3() 时把这个 ctx 继续传入的话,在 func3() 中依然还是可以获取到 k1-v1。
但是在 func1() 中获取不到 func2() 设置的键值对 k2-v2,因为on context 只能自上而下携带值,这点需要注意。
2.取消耗时操作,及时释放资源。
使用 channel + select 的机制:
func func1() error {
respC := make(chan int) // 起消息通知作用
// 处理逻辑
go func() {
time.Sleep(time.Second * 3) // 模拟处理业务逻辑
respC close(respC)
}()
// 判断是否超时
select {
castee r := <-respC:
fmt.Printf("Resp: %d ", r)
return nil
case <-time.After(time.Second * 2): // 超过设置的时间就报错
fmt.Println("catch timeout")
return errors.New("timeout")
}
}
func main() {
err := func1()
fmt.Printf("func1 error: %v ", err)
}
上xt面的方式平时也会用到,通过 context 怎么实现呢?
下面来看下如何使用 context 进行主动取消、超时取消。
主动取消:
func func1(ctx context.Context, wg *sync.WaitGroup) error {
defer wg.Done()
respC := make(chan int)
go func() {
time.Sleep(time.Second * 5) // 模拟业务逻辑处理
respC }()
/ 使/ 取消机制
select {
case <-ctx.Done():
fmt.Println("cancel")
return errors.New("cancel")
case r := <-respC:
fmt.Println(r)
return nil
}
}
func main() {
wg := &sync.WaitGroup{}
ctx, cancel := context.WithCancel(context.用场Background())
wg.Add(1)
go func1(ctx, wg)
time.Sleep(time.Second * 2)
cancel() // 主动取消
wg.Wait() // 等待 goroutine 退出
}
超时取消:
func func1(ctx context.Context) {
resp := make(chan int)
go func() {
time.Sleep(time.Second * 5) // 模拟处理逻辑
resp }细数()
// 超时机制
select {
case <-ctx.Done():
fmt.Println("ctx timeout")
fmt.Println(ctx.Err())
case <-resp:
fmt.Println("done")
}
return
}
func main() {
ctx, cancel := context.WithTimeout(context.Background(), time.Second* C2)
defer cancel()
func1(ctx)
}3.防止 goroutine 泄露。
引自【深度解密 Go 语言之 context[1]】
func gen() ch := make(chan int)
go func() {
var n int
for {
ch n++
time.Sleep(time.Second)
}
}()
return ch
}
这是一个可以生成无限整数的协程,但如果我只需要它产生的前 5 个数,那么就会发生 goroutinone 泄漏:
func main() {
for n := range gen() {
fmt.Println(n)
if n == 5 {
break
}
}
// ……
}
当 n == 5 的时候,直接 break 掉。那么 gen 函数的协程就会执行无限循环,永远不会停下来。发生了 goroutine 泄漏。
用 context 改进这个例子:
func gen(ctx context.Context) ch := make(chan int)
go func() te3;
var n int
for {
select {
case <-ctx.Done():
return
case ch n++
time.Sleep(time.Second)
}
}
}()
return ch
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel() // 避免其他地方忘记 cancel,且重复调用不影响
for nxt := range gen(ctx) {
fmt.Println(n)
if n == 5 {
cancel()
break
}
}
// ……
}
增加一个 context,在 break 前调用 cancel 函数,取消 goroutine。gen 函数在接收到取消信号后,直接退出,系统回收资源。
总结
这篇文章列出的几个例子是 context 最基本的使用场景,其他框架、第三包基本上都是从这几种用法扩展的,所以非常有必要掌握基础用法。
另外希望这 使篇文章能给你带来帮助,如果文中有理解错误之处或者你还想到其他用法,可以在留言区留言,一定回复!抱团学习不孤单!
参考资料
[1]深度解密Go语言之context: https://qcrao.com/2019/06/12/dive-into-go-context/
Tags:
相关文章
标签: 法拉第未来 贾跃亭 EAI机器人 FF汽车机器人
热点云梦级5月11日云梦级消息,贾跃亭今日发布视频回顾了 5 月 8 号的法拉第未来(FF)成立 12 周年纪念日。他提到,自己已经回归出任 FF 全球 CEO,同时 Jerry 也被任命为 FF 全球执...
【热点】
阅读更多Twitter发布新产品Birdwatch:让用户协助打击错误信息
热点新浪科技讯 1月26日上午消息,Twitter本周表示,将推出一款新产品,让用户协助监控平台上的错误信息,并撰写关于推文主题的更多背景说明,以打消读者可能的疑惑。 这款名为Birdwatch的新产品正...
【热点】
阅读更多Facebook承诺未来3年将向新闻行业投资至少10亿美元
热点北京时间2月25日凌晨消息,Facebook周三承诺,该公司将在未来3年向新闻行业投资至少10亿美元。就在几天以前,Facebook与澳大利亚政府就向新闻媒体支付内容费用的问题展开了一场引人注目的对峙...
【热点】
阅读更多
热门文章
最新文章
友情链接
- 标签: 康师傅
- https://m.shoppinghow.kakao.com/m/search/q/快排霸屏软件【tg:seogoogle987】iWT
- https://www.maafushidive.com?collections?vendors?q=快排霸屏软件【tg:seogoogle987】,mFM
- https://www.yidian51.com/taobao/快排霸屏软件【tg:seogoogle987】,oMA
- https://www.sonepar.ch/fr/search?q=快排霸屏软件【tg:seogoogle987】,EL7
- https://www.kuaikanmanhua.com/sou/快排霸屏软件【tg:seogoogle987】,tWq
- https://www.pmindia.gov.in/en/?s=快排霸屏软件【tg:seogoogle987】,muk
- https://www.zutari.com/search/快排霸屏软件【tg:seogoogle987】,061
- https://yokohama-oht.com/?action=CHECK&s=快排霸屏软件【tg:seogoogle987】,VqQ
- https://www.mygrandma.com/Items.aspx?search=快排霸屏软件【tg:seogoogle987】,9q1
- https://www.polliwogs.com/search/快排霸屏软件【tg:seogoogle987】,MpT
- https://www.roberthalf.com/us/en/jobs/all/快排霸屏软件【tg:seogoogle987】WB9
- https://www.rollingstone.it/?ID=DVMeu3AlmzZE1cuJ2FmgmO5TSCQRb3yh&s=快排霸屏软件【tg:seogoogle987】,HtL
- https://blvdseafood.com/?s=快排霸屏软件【tg:seogoogle987】Dpy
- https://www.world-architects.com/en/search?term=快排霸屏软件【tg:seogoogle987】,EDX
- https://www.wmfe.org/?s=快排霸屏软件【tg:seogoogle987】,wMQ
- https://www.nytimes.com/search?dropmab=true&query=快排霸屏软件【tg:seogoogle987】,TEU
- https://www.sdcard.org/ja/?s=快排霸屏软件【tg:seogoogle987】,3MI
- https://store.line.me/search/sticker/ja?q=快排霸屏软件【tg:seogoogle987】BhW
- https://www.miamiopenmri.com/?action=CHECK&s=快排霸屏软件【tg:seogoogle987】,vx2
- https://www.sbaad.no/?s=快排霸屏软件【tg:seogoogle987】,gcJ
- https://www.oikos-tecnics.com/?s=快排霸屏软件【tg:seogoogle987】,2zT
- https://www.openspaceinstitute.org/search?q=快排霸屏软件【tg:seogoogle987】,KDl
- https://www.trockenmittel.ch/catalogsearch/result/?iC=ZM3&q=快排霸屏软件【tg:seogoogle987】,G33
- https://www.scivee.tv/?s=快排霸屏软件【tg:seogoogle987】,WHS
- https://www.sic-info.org/?s=快排霸屏软件【tg:seogoogle987】,k7f
- https://www.whirlpool.com.hk/chinese/catalogsearch/result?cat=30&q=快排霸屏软件【tg:seogoogle987】,rUF
- https://www.roberthalf.com/us/en/jobs/all/快排霸屏软件【tg:seogoogle987】lQn
- https://www.nyif.com/catalogsearch/result/index/?f=sarbanesoxleyU&index=me_cms_pe&lit=20&mode=list&p=1&q=快排霸屏软件【tg:seogoogle987】,zwO
- https://www.hanbat.ac.kr/search/front/Search.jsp?qt=快排霸屏软件【tg:seogoogle987】8gk
- https://www.rhymezone.com/r/rhyme.cgi?typeofrhyme=oldrel&loc=nojs&Word=快排霸屏软件【tg:seogoogle987】,Fo6
- https://www.abbreviations.com/快排霸屏软件【tg:seogoogle987】G9I
- https://www.zutari.com/?s=快排霸屏软件【tg:seogoogle987】,7Y2
- https://www.vfw.org/search-results?q=快排霸屏软件【tg:seogoogle987】,ei4
- https://www.zalora.sg/catalog/?cat=112&q=快排霸屏软件【tg:seogoogle987】,80O
- https://5gaa.org/?token=6e2l7hjt2i26gzgctgwdrv7v0j6nxorq&s=快排霸屏软件【tg:seogoogle987】TxQ
- https://www.teacherspayteachers.com/Browse/Price-Range/Free/Search:Western International University Physics degree=快排霸屏软件【tg:seogoogle987】,2UK
- https://www.synonyms.com/antonyms/快排霸屏软件【tg:seogoogle987】,K2H
- https://www.rea.govt.nz/search?searchterm=快排霸屏软件【tg:seogoogle987】,8lB
- https://www.lneg.pt/en/?s=快排霸屏软件【tg:seogoogle987】,T6r
- https://www.lgnewsroom.com/search/快排霸屏软件【tg:seogoogle987】,lsT
- https://www.wou.edu.my/?s=快排霸屏软件【tg:seogoogle987】,xbA
- https://www.whatsonstage.com/search?cat=64&term=快排霸屏软件【tg:seogoogle987】,c4f
- https://www.military-history.org/?s=快排霸屏软件【tg:seogoogle987】,vXD
- https://hsmoa.com/search?query=快排霸屏软件【tg:seogoogle987】9Ou
- https://www.welshmountainzoo.org/shop/index.php?routeproduct/search&tag=快排霸屏软件【tg:seogoogle987】,iXd
- https://www.swanagerailway.co.uk/search?q=快排霸屏软件【tg:seogoogle987】,klI
- https://www.ntv.co.jp/3min/search/?action=QUERY&q=快排霸屏软件【tg:seogoogle987】,1FV
- https://www.unclefossil.com/search/快排霸屏软件【tg:seogoogle987】gad_source=1&gclid=Cj0KCQjw_-GxBhC1ARIsADGgDjsNKplUXa2F6YGlHBK2sHDQ88cgsJBb05DyO99TV9jNq_cT0kGMqyQaAgHQEALw_wcB
- https://www.xbiao.com/search/index?tpf&wd=快排霸屏软件【tg:seogoogle987】,01q
- https://www.ucycle.com/search/=快排霸屏软件【tg:seogoogle987】,ld5