Golang学习笔记-Context

土豆吞噬者 · · 2408 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

有时候一个功能可能涉及多个goroutine的调用,当该功能中途需要取消时,需要通知其它goroutine,这个时候Context就可以派上用场了,Context主要用来处理退出通知以及上下文数据传递问题。

Context之间被设计为父子关系,要创建Context,首先要创建根节点,通常是context.Background(),该Context不能被取消,没有值,也没有过期时间。

有了根节点后,接下来就是创建子节点,子节点还可以继续创建子节点,有四种方式创建子节点:WithCancel/WithDeadline/WithTimeout/WithValue,前三种方法都会返回Context和CancelFunc,父节点通过调用CancelFunc通知子节点取消,子节点通过Context提供的Done方法检测是否被取消。WithValue将一对key-value关联到Context,通过Context提供的Value方法获取指定key对应的value。

WithDeadline/WithTimeout创建的Context在超时后会自动调用CancelFunc,如果调用没有超时,需要主动调用CancelFunc以避免不必要的资源浪费,所以通常在在调用WithDeadline/WithTimeout之后会使用defer cancel()确保资源尽快释放。

package main

import (
    "context"
    "fmt"
    "time"
)


func say(ctx context.Context){
    for{
        select {
        case <-ctx.Done():
            return
        default:
            fmt.Println(ctx.Value("test"))
            time.Sleep(time.Second)
        }
    }

}


func main(){
    //5秒后调用cancelFunc取消say
    ctx,cancelFunc:=context.WithCancel(context.Background())
    ctx=context.WithValue(ctx,"test","hello")
    go say(ctx)
    time.Sleep(time.Second*5)
    cancelFunc()



    //2秒后调用cancelFunc取消say
    ctx,_=context.WithTimeout(context.Background(),time.Second*2)
    ctx=context.WithValue(ctx,"test","world")
    go say(ctx)

    time.Sleep(time.Second*5)
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:土豆吞噬者

查看原文:Golang学习笔记-Context

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2408 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传