浅谈Golang上下文Context

Context

前言

Golang底层原理剖析之上下文Context

  1. context 主要用来在 goroutine 之间传递上下文信息 - 取消信号、超时时间、截止时间、k-v 等
  2. Context上下文 - 结合Linux操作系统的CPU上下文切换/子进程与父进程进行理解
  3. 如何优雅地使用context - 与select配合使用,管理协程的生命周期
  4. Context的底层实现是什么? - mutex与channel的结合,前者用于初始部分参数,后者用于通信

代码

package main

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

// Tip: 通过 cancel 主动关闭
func ctxCancel() {
	ctx, cancel := context.WithCancel(context.Background())
	go func(ctx context.Context) {
		select {
		case <-ctx.Done():
			fmt.Println(ctx.Err())
		case <-time.After(time.Millisecond * 100):
			fmt.Println("Time out")
		}
	}(ctx)

	cancel() //外部调用cancel(),其ctx.Done()将会接收到channel信息
}

// Tip: 通过超时,自动触发
func ctxTimeout() {
	ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*10) //10毫秒后会自动触发
	// 主动执行cancel,也会让协程收到消息
	defer cancel()
	go func(ctx context.Context) {
		select {
		case <-ctx.Done():
			fmt.Println(ctx.Err())
		case <-time.After(time.Millisecond * 100):
			fmt.Println("Time out")
		}
	}(ctx)

	time.Sleep(time.Second)
}

// Tip: 通过设置截止时间,触发time out
func ctxDeadline() {
	ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(10*time.Millisecond))
	defer cancel()
	go func(ctx context.Context) {
		select {
		case <-ctx.Done():
			fmt.Println(ctx.Err())
		case <-time.After(time.Millisecond * 100):
			fmt.Println("Time out")
		}
	}(ctx)

	time.Sleep(time.Second)
}

// Tip: 用Key/Value传递参数,可以浅浅封装一层,转化为自己想要的结构体
func ctxValue() {
	ctx := context.WithValue(context.Background(), "user", "wxf")
	go func(ctx context.Context) {
		v, ok := ctx.Value("user").(string)
		if ok {
			fmt.Println("pass user value", v)
		}
	}(ctx)
	time.Sleep(time.Second)
}

注意点

子节点覆盖父节点数据的情况
在这里插入图片描述
最好不要直接使用stirng,int这种基础类型作为key,而是用自定义类型包装一下
在这里插入图片描述
valueCtx通过context形成了一个链表结构,不过需要注意,context本身是本着不可改变的模式设计的,所以不要试图修改ctx里面保存的值

参考

深入理解Golang之context
【Golang】Context了解下~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cheems~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值