当前位置: 首页 > news >正文

Context

Context

Context

Golang中Context底层是:

type Context interface {Deadline() (deadline time.Time, ok bool)Done() <-chan struct{}Err() errorValue(key any) any
}
  • Deadline:返回 context 何时应当超时的时间(deadline),以及一个布尔值,指示是否存在这样的截止时间。
  • Done:返回一个 <-chan struct{} 通道,当 context 被取消或超时时,该通道会被关闭。
  • Err():返回 context 结束的原因,可能的返回值包括 nil(如果 context 尚未结束)、context.Canceled(如果 context 被取消)或 context.DeadlineExceeded(如果 context 超时)。
  • Value:返回 context 关联的键对应的值,允许在不同的函数、goroutine 之间传递请求范围内的数据。

创建Context

root创建context:

context.Background()
context.TODO()

context创建需要依靠with系列函数:

在这里插入图片描述

context有什么用?

  1. 用于并发控制,控制协程的优雅退出
  2. 上下文的信息传递

Context就是用来在父子goroutine之间进行值传递以及发送cancel信号的一种机制。

并发控制

1.WithCancel

WithCancel 创建一个新的子 Context 和一个取消函数 CancelFunc。当调用取消函数时,子 Context 及其所有派生的 Context 都会被取消。这会触发所有通过这个 Context 执行的操作的停止。

package mainimport ("context""fmt""time"
)func main() {ctx, cancel := context.WithCancel(context.Background())go watch(ctx, "g1")go watch(ctx, "g2")time.Sleep(6 * time.Second)fmt.Println("end dd")cancel()time.Sleep(time.Second)
}func watch(ctx context.Context, name string) {for {select {case <-ctx.Done():fmt.Println("end ", name)returndefault:fmt.Println("watch ", name)time.Sleep(time.Second)}}
}
2.WithDeadline

WithDeadline 创建一个新的子 Context,并指定一个绝对的截止时间(deadline)。当当前时间超过这个截止时间时,子 Context 会自动取消。

package mainimport ("context""fmt""time"
)func main() {ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(4*time.Second)) // 设置超时时间为4sdefer cancel()go watch(ctx, "g1")go watch(ctx, "g2")time.Sleep(6 * time.Second)fmt.Println("end dd")
}func watch(ctx context.Context, name string) {for {select {case <-ctx.Done():fmt.Println("end ", name)returndefault:fmt.Println("watch ", name)time.Sleep(time.Second)}}
}
3.WithTimeout

WithTimeout 创建一个新的子 Context,并指定一个相对时间(timeout)。子 Context 会在超出这个时间段后自动取消。

package mainimport ("context""fmt""time"
)func main() {ctx, cancel := context.WithTimeout(context.Background(), 4*time.Second) // 设置超时时间为4sdefer cancel()go watch(ctx, "g1")go watch(ctx, "g2")time.Sleep(6 * time.Second)fmt.Println("end dd")
}func watch(ctx context.Context, name string) {for {select {case <-ctx.Done():fmt.Println("end ", name)returndefault:fmt.Println("watch ", name)time.Sleep(time.Second)}}
}
4.WithValue

WithValue 创建一个新的子 Context,并将一个键值对 (key, value) 存储在该 Context 中。其他代码可以通过 ctx.Value(key) 方法来访问这个值。

package mainimport ("context""fmt""time"
)func func1(ctx context.Context) {fmt.Println("name is ", ctx.Value("name").(string))
}func main() {ctx := context.WithValue(context.Background(), "name", "张三")go func1(ctx)fmt.Println(ctx.Value("name"))time.Sleep(time.Second)
}

http://www.mrgr.cn/news/16515.html

相关文章:

  • Kimi 化身为你的私人翻译神器
  • 虚拟化设置和虚拟机相关的环境搭建
  • CF C. Candy Store
  • 如何接收请求数据
  • 用Starbound星际边界服务器开服联机
  • 网优学习干货:2.6G仿真操作(2)
  • kerberos 认证流程-理解
  • [国家新闻出版署]网络游戏防沉迷实名认证系统接口对接实例(Java版)
  • 让电脑屏幕保持常亮
  • keil5烧录后不自动复位和Flash Download failed - “Cotex-M3“报错解决
  • 使用python导出Excel表格中的lua配置
  • 掌握EF Core:全方位面试指南,助你从初级到高级轻松晋级
  • C++单例模式与特殊类的设计
  • Java面试自我介绍
  • 每日一题——第六十八题
  • 指针空值类型-nullptr
  • 51单片机.之i2c读写eproom
  • 单门店共享自习室小程序系统源码搭建对接门禁和空开api
  • 深入理解并实现——归并排序【C语言】
  • ChatTTS 长音频合成和本地部署2种方式,让你的“儿童绘本”发声的实战教程(文末有福利)