golang context 使用

golang context 讲解

golang在context包下提供了一个Context,它可以用来在多个goroutine之间传递信号

type Context interface {

	Deadline() (deadline time.Time, ok bool)
    
	Done() <-chan struct{}

	Err() error

	Value(key interface{}) interface{}
}

Done方法在context被取消或者工作完成时返回一个close掉的channel,如果context无法被取消,则可能返回一个nil

Deadline 返回context到达指定时间被取消的时间

1 实现

1.1 BackGround

backGround 不可被取消,没有deadLine

1.2 WithCancel

WithCancel返回一个继承的Context,这个Context在父Context的Done被关闭时关闭自己的Done通道,或者在自己被Cancel的时候关闭自己的Done。 WithCancel同时还返回一个取消函数cancel,这个cancel用于取消当前的Context。

func someHandler() {
    c := context.Background()
    ctx, cancel := context.WithCancel(c)
    go doStuff(ctx)

    //10秒后取消doStuff
    time.Sleep(5 * time.Second)
    cancel()

}

//每1秒work一下,同时会判断ctx是否被取消了,如果是就退出
func doStuff(ctx context.Context) {
    for {
        time.Sleep(1 * time.Second)
        select {
        case <-ctx.Done():
            fmt.Println("done")
            return
        default:
            fmt.Println("work")
        }
    }
}

func main() {
    someHandler()
}

1.3 withTimeout

设置超时时间,类似withCancel,只是多了一个超时时间,调用cancel或者达到超时时间context都会被取消

func someHandler() {
    c := context.Background()
    ctx, cancel := context.WithTimeout(c, time.Second*3)
    go doStuff(ctx)

    //10秒后取消doStuff
    time.Sleep(5 * time.Second)
    cancel()

}

//每1秒work一下,同时会判断ctx是否被取消了,如果是就退出
func doStuff(ctx context.Context) {
    for {
        time.Sleep(1 * time.Second)
        select {
        case <-ctx.Done():
            fmt.Println("done")
            return
        default:
            fmt.Println("work")
        }
    }
}

func main() {
    someHandler()
}

1.4 withDeadline

withDeadline等价于withTimeout,只是讲超时时间改为截止时间

1.5 withValue

withValue返回了一个key与value相关联的context

func someHandler() {
    c := context.Background()
    ctx := context.WithValue(c, "a", "b")
    go doStuff(ctx)
    time.Sleep(time.Second)

    //10秒后取消doStuff

}

func doStuff(ctx context.Context) {
    fmt.Println(ctx.Value("a"))

}

func main() {
    someHandler()
}

转载于:https://my.oschina.net/mrrdai/blog/1838998

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值