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

golang的context和chan 的使用

1. context 作用

context包的context的接口,主要是控制协程执行上下文的时间,以及取消程序的执行,以及上下文中传递数据等作用,golang中耗时或者需要协同的操作都会见到context的身影。

context有几个常用的方法

1.1 context.Backgroud()

创建一个空白的,顶级的,不会被取消的上下文。

1.2 context.WithTimeout

创建一个有执行时间限制的上下文
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {
return WithDeadline(parent, time.Now().Add(timeout))
}
可以通过ctx.Done()方法获取上下超时的通知。

package mainimport ("context""fmt""time"
)func main() {parentCxt := context.Background()ctx, cancel := context.WithTimeout(parentCxt, time.Second*5)go longTimeTask(ctx)time.Sleep(time.Second * 10)cancel()fmt.Println("task cancel success")
}func longTimeTask(ctx context.Context) {for {//fmt.Println("ok")select {case <-time.After(time.Second * 1):fmt.Println("task compete")case <-ctx.Done():fmt.Println("time out")return}}
}

1.3 context.WitchCancel(parentContext)

获取一个可以中止的上下文,该方法会返回一个新的context,和cancel函数,调用cancel函数后,通过ctx.Done()方法可以获取到上下文取消的通知

package mainimport ("context""fmt""time"
)func main() {parentCxt := context.Background()ctx, cancel := context.WithCancel(parentCxt)go longTimeTask(ctx)time.Sleep(time.Second * 10)cancel()fmt.Println("task cancel success")
}func longTimeTask(ctx context.Context) {for {//fmt.Println("ok")select {case <-time.After(time.Second * 1):fmt.Println("task compete")case <-ctx.Done():fmt.Println("time out")return}}
}

1.4 context.WithValue()

func WithValue(parent Context, key, val any) Context {
if parent == nil {
panic(“cannot create context from nil parent”)
}
if key == nil {
panic(“nil key”)
}
if !reflectlite.TypeOf(key).Comparable() {
panic(“key is not comparable”)
}
return &valueCtx{parent, key, val}
}
可以在上下文中存贮一些参数,通过上下文随时获取。

2.chan 信道

golang的chan和map,切片,接口,函数一样是引用类型。
golang更加推荐使用chan去解决并发的协作的问题,对chan的读写是并发安全的,当然你也可也以使用sync.Mutex等包来控制并发。

http://www.lryc.cn/news/353128.html

相关文章:

  • 洛谷P3574 [POI2014] FAR-FarmCraft(树形dp)
  • vue/core源码中ref源码的js化
  • 准备打ccf
  • k8s遇到的错误记录
  • 全局平均池化笔记
  • 【数仓系列】maxcompute、postgresql、sparksql等行转列数据处理实战总结(其他类型持续总结更新)
  • 用数据,简单点!奇点云2024 StartDT Day数智科技大会,直播见
  • Cloneable接口和深拷贝
  • C++:vector的介绍及使用
  • 【机器学习】大模型在机器学习中的应用:从深度学习到生成式人工智能的演进
  • 营销短信XML接口对接发送示例
  • 【C语言刷题系列】求一个数组中两个元素a和b的和最接近整数m
  • Python pdf2imges -- pdf文件转图片
  • 分布式版本控制工具 git
  • Flutter 中的 ExpansionTile 小部件:全面指南
  • 二进制的协议的测试程序
  • 多线程事务
  • 春秋云境CVE-2020-26048
  • MySQL 带游标的存储过程(实验报告)
  • 结构体(位段)内存分配
  • 基于SSH的母婴用品销售管理系统带万字文档
  • 说些什么好呢
  • 1301-习题1-1高等数学
  • C语言之指针进阶(3),函数指针
  • RabbitMQ安装及配套Laravel使用
  • java在类的定义中创建自己的对象?
  • 掌握C++回调:按值捕获、按引用捕获与弱引用
  • 抖音运营_如何做出优质的短视频
  • Day21:Leetcode513.找树左下角的值 +112. 路径总和 113.路径总和ii + 106.从中序与后序遍历序列构造二叉树
  • Java数据结构和算法(B树)