go context学习
context学习
- context的struct设计
type Context interface {Deadline() (deadline time.Time, ok bool)Done() <-chan struct{}Err() errorValue(key interface{}) interface{}
}
- struct中字段分析
- Deadline()返回设置的截止时间和有无设置截止时间
- Done()返回一个只读的chan,用来通知是否要释放资源
- Err()返回取消的原因
- Value(key interface{})获取绑定在context上的值,是一个键值对。这个值是线程安全的。(在并发情况下,能够正确处理这个共享变量)
- context的常用方法实例
- 参考代码
package mainimport("fmt""time""golang.org/x/net/context"
)type faveContextKey string //定义别名func main(){fmt.Println("context包学习")UseContext()UseContextWithDeadline()UseContextWithTimeout()UseContextWithValue()
}func UseContext(){// 使用withCancel生成上下文gen := func (ctx context.Context)<- chan int{dst := make(chan int) //无缓冲,无长度n := 1fmt.Println("这个函数被调用多少次:",n) //被调用一次go func (){for{select{// 多个case同时满足,就会随机执行casecase <- ctx.Done():// 关闭上下文fmt.Println("ctx.Done",ctx.Err(),n)returncase dst <- n: //要么运行完这个作用域,要么就不用运行n++fmt.Printf("n = %v \n",n)}}}()//发送器return dst}ctx,cancel := context.WithCancel(context.Background())defer cancel()data := gen(ctx)for n:= range data{ //接收fmt.Println(n)if n== 16{break}}
}func UseContextWithDeadline(){// withDeadline作用:设置context的存活期d := time.Now().Add(50 * time.Millisecond)ctx,cancel := context.WithDeadline(context.Background(),d)if ctx == nil{fmt.Println("ctx is nil")return}defer cancel()select{case <-time.After(time.Second*1):fmt.Println("overslept")case <- ctx.Done():fmt.Println(ctx.Err())}
}func UseContextWithTimeout(){// withTimeout作用:设置context的存活期ctx,cancel := context.WithTimeout(context.Background(),50*time.Millisecond)if ctx == nil{fmt.Println("ctx is nil")return}defer cancel()select{case <-time.After(time.Second*1):fmt.Println("overslept")case <- ctx.Done():fmt.Println(ctx.Err())}
}func UseContextWithValue(){// withValue作用:带值f := func(ctx context.Context,k faveContextKey){if v := ctx.Value(k);v!=nil{fmt.Printf("key:%v,value:%v \n",k,v)}else{fmt.Println("key not found!",k)}}k := faveContextKey("language")ctx:= context.WithValue(context.Background(),k,"go")if ctx==nil{fmt.Println("ctx is nil")}f(ctx,k)f(ctx,faveContextKey("color"))
}
context包的用途
- 构建树形关系的上下文,实现上一层的Goruntine控制下一层的Goruntine。通过传递context的对象变量方式对下一层的Goruntine进行管控。通知信号为context对象中的Done()进行控制。
- 参考用例
帮助理解的博客,(侵权,请告知,我会删了的)
- 理解 Go Context 机制
- Golang Context深入理解
- 写的不好的地方可以,加微信讨论一下。谢谢
转载于:https://www.cnblogs.com/MyUniverse/p/11600981.html
go context学习相关推荐
- golang库context学习
context库 context最早的背景说明还是来源于官方的 博客,说明如下: 在Go服务器中,每个传入请求都在其自己的goroutine中进行处理. 请求处理程序通常会启动其他goroutine来 ...
- Oracle的 EXEC SQL CONTEXT学习
EXEC SQL CONTEXT... 是Oracle Pro*C的特有的语法,详细信息参见 http://docs.oracle.com/cd/B28359_01/appdev.111/b28427 ...
- spring context 学习总结(注解功能,配置文件,jar包)
目录 一jar包 1.POM.XML文件 总项目的POM.XML文件 公用工具的模块POM.XML文件 子类模块POM.XML文件 二配置文件 2.web.xml文件 总项目的web.xml文件 工具 ...
- [深度学习大讲堂]文化、进化与局部最小值
本文为微信公众号[深度学习大讲堂]特约稿,转载请注明出处 Reference:Culture vs Local Minima [Bengio.2012] 关于作者 首次看到Bengio教授这篇论文是在 ...
- PostgreSQL杂记页
1--数据库设计 1.1------------------- 同时10万个事务在线,读写频繁,数据库该如何设计 2--Linux 2.1--fdisk----------- 对linux下 fd ...
- Django 开发微信公众号
其实这个功能一早就完成了,但是直到今天才有空把它记录下来~~ 准备工作 在正式开始之前,需要做一些准备: a: 安装好wechat_sdk(怎么安装请看我前面写<<基于Django的微信公 ...
- 干货!基于常识图谱和混合策略的情绪支持对话系统
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 情绪支持对话系统旨在理解人类用户的情绪困扰,并通过提供共情回复和疏导建议给予情感陪伴. 为了让对话系统拥有更强大的理解能力,我们在论文& ...
- 10分钟搞定!Golang分布式ID集合
导语 | 本文是基于最近对Golang分布式ID的相关讨论,希望本文内容可以对相关技术感兴趣的开发者提供一点经验和帮助. 一.本地ID生成器 (一)uuid uuid有两种包: github.com/ ...
- Android Studio 常见问题 与 操作指南
安装 自动选择好了 jre 每次安装下载 一 .常见问题 1. Error while waiting for device: The emulator process for AVD Pixel_4 ...
最新文章
- Bio-protocol首届生物实验短视频大赛
- Linux-进程内存占用情况
- asp开发中存储过程应用全接触 _asp技巧
- 怎么会执行sql 懒加载 没用_太神奇的 SQL 查询经历,group by 慢查询优化!
- 无人机飞控开发平台培训理论课程——飞行原理
- 嵌入式论文3000字_SCI英文论文一般多少字
- java文件比较_Java 比较两个任意文件是否相同
- 编译安装Apache、php、xcache、FastCGI及相关整合
- mate20html查看器,华为Mate20系列迎重大升级 系统支持方舟编译器
- Python文件之----CSV
- 11.无限分类表的数据库设计
- RBF神经网络——案例二
- 微型计算机系统性能优化及测试,第八章 微型计算机系统的测试、优化和升级.doc...
- python里offset啥意思_深度理解Jquery 中 offset() 方法
- 无线局域网安全(一)———WEP加密
- win10应用闪退解决方法
- 电脑jpg图片怎么批量转换成png
- maven自定义插件-mojo标注和参数
- 腾讯云对象存储的完整教程,java将文件上传到腾讯云上后返回可以访问的连接
- 雷电、夜神、天天、逍遥等模拟器中找不到要下载的软件解决方法
热门文章
- 微软 .net 你更新这么快IDE vs2015 、语法糖 6.0、framework、‘吹得这么牛,然并用...
- linux挂载NTFS硬盘
- 华为光模块,华为光纤模块,华为单模光模块,华为多模光模块,华为千兆光模块
- 抄袭事件果然是机器人程序所为
- Web Form调用Windows Form的控件
- 静脉阻塞指标+补充笔记
- sas ondemand for academics使用
- colab中安装lightgbm的GPU版本
- Failed to find data source: text
- 09_Fibonacci