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

Go Context

Context

介绍

Context 代表了协程的上下文,用以在父子协程之间传递控制信号,共享变量等操作// context.Context 接口
type Context interface {// 当Context自动取消或者到了取消时间被取消后返回Deadline() (deadline time.Time, ok bool)// 当Context被取消或者到了deadline返回一个被关闭的channelDone() <-chan struct{}// 当Context被取消或者关闭后,返回context取消的原因Err() error// 获取 Context 中保存的键值对数据Value(key any) any
}

使用 WithValue() 传递数据

func A(ctx context.Context) context.Context {time.Sleep(1 * time.Second)fmt.Println("A: ", ctx.Value("main"))ctx = context.WithValue(ctx, "A", "A-1")go B(ctx)return ctx
}func B(ctx context.Context) context.Context {time.Sleep(1 * time.Second)fmt.Println("B: ", ctx.Value("main"))fmt.Println("B: ", ctx.Value("A"))return ctx
}func main() {ctx := context.WithValue(context.Background(), "main", "main-1")go A(ctx)time.Sleep(3 * time.Second)
}

使用 WithCancel() 取消操作

func main() {ctx, cancel := context.WithCancel(context.Background())go Speak(ctx)time.Sleep(3 * time.Second)cancel()time.Sleep(1 * time.Second)
}func Speak(ctx context.Context) {for range time.Tick(time.Second) {select {case <-ctx.Done():fmt.Println("我要闭嘴了")returndefault:fmt.Println("balabalabalabala")}}
}

使用 WithDeadline() 设置截止时间

使用 WithTimeout() 设置超时时间

withTimeout和withDeadline作用是一样的,就是传递的时间参数不同,会通过传入的时间来自动取消Context,都会返回一个cancelFunc方法,通过调用这个方法可以达到提前进行取消
使用的过程还是建议在自动取消后也调用cancelFunc去停止定时减少不必要的资源浪费
func A(in chan struct{}) {time.Sleep(1 * time.Second)in <- struct{}{}
}func B(in chan struct{}) {time.Sleep(3 * time.Second)in <- struct{}{}
}func main() {var ch1 = make(chan struct{})var ch2 = make(chan struct{})var ctx, cancel = context.WithTimeout(context.Background(), 2*time.Second)go func() {go A(ch1)select {case <-ctx.Done():fmt.Println("ctx timeout")breakcase <-ch1:fmt.Println("A Done")}}()go func() {go B(ch2)select {case <-ctx.Done():fmt.Println("ctx timeout")breakcase <-ch2:fmt.Println("B Done")}}()defer cancel()time.Sleep(5 * time.Second)
}
http://www.lryc.cn/news/377204.html

相关文章:

  • centOS Stream9配置NAT8网络
  • Linux - 进程
  • nginx+tomcat负载均衡、动静分离群集【☆☆☆☆☆】
  • MySQL容器部署步骤
  • 在 Ubuntu 18.04.4 LTS上安装 netmap
  • spark 整合 yarn
  • 蓝桥杯十五届国赛模拟题1答案
  • 分布式之日志系统平台ELK
  • git常见错误
  • 构建稳定高效的消息传递中间件:消息队列系统的设计与实现
  • 支持 MKV、MP4、AVI、MPG 等格式视频转码器
  • yum
  • 【单片机毕业设计选题24016】-基于STM32和阿里云的采空区环境监测系统设计
  • Leetcode3179. K 秒后第 N 个元素的值
  • vue3第二阶段的开发文档
  • 【网络安全学习】漏洞扫描:- 02- nmap漏洞扫描
  • Web开发技能树-HTML-class/id/name/tag
  • 据APO Research(阿谱尔)统计,2023年全球乳酸企业产能约119.3万吨
  • 百度文心智能体平台(想象即现实):轻松上手,开启智能新时代!创建属于自己的智能体应用。
  • Linux中ls -lsa 和ls -lst区别
  • TDengine 签约上海晶澳太阳能,助力储能业务平台搭建
  • 【数据结构】选择题
  • 数据库 |试卷八试卷九试卷十
  • 【华为HCIA数通网络工程师真题-构建互联互通的IP网络】
  • Kafka 负载均衡挑战及解决思路
  • 【Java面试】二十一、JVM篇(中):垃圾回收相关
  • 深入理解预处理
  • DSP28335:定时器
  • 系统架构理解
  • uni-app页面的跳转三种方式,功能作用有什么区别?