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学习相关推荐

  1. golang库context学习

    context库 context最早的背景说明还是来源于官方的 博客,说明如下: 在Go服务器中,每个传入请求都在其自己的goroutine中进行处理. 请求处理程序通常会启动其他goroutine来 ...

  2. Oracle的 EXEC SQL CONTEXT学习

    EXEC SQL CONTEXT... 是Oracle Pro*C的特有的语法,详细信息参见 http://docs.oracle.com/cd/B28359_01/appdev.111/b28427 ...

  3. spring context 学习总结(注解功能,配置文件,jar包)

    目录 一jar包 1.POM.XML文件 总项目的POM.XML文件 公用工具的模块POM.XML文件 子类模块POM.XML文件 二配置文件 2.web.xml文件 总项目的web.xml文件 工具 ...

  4. [深度学习大讲堂]文化、进化与局部最小值

    本文为微信公众号[深度学习大讲堂]特约稿,转载请注明出处 Reference:Culture vs Local Minima [Bengio.2012] 关于作者 首次看到Bengio教授这篇论文是在 ...

  5. PostgreSQL杂记页

    1--数据库设计 1.1-------------------  同时10万个事务在线,读写频繁,数据库该如何设计 2--Linux 2.1--fdisk-----------  对linux下 fd ...

  6. Django 开发微信公众号

    其实这个功能一早就完成了,但是直到今天才有空把它记录下来~~ 准备工作 在正式开始之前,需要做一些准备: a: 安装好wechat_sdk(怎么安装请看我前面写<<基于Django的微信公 ...

  7. 干货!基于常识图谱和混合策略的情绪支持对话系统

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 情绪支持对话系统旨在理解人类用户的情绪困扰,并通过提供共情回复和疏导建议给予情感陪伴. 为了让对话系统拥有更强大的理解能力,我们在论文& ...

  8. 10分钟搞定!Golang分布式ID集合

    导语 | 本文是基于最近对Golang分布式ID的相关讨论,希望本文内容可以对相关技术感兴趣的开发者提供一点经验和帮助. 一.本地ID生成器 (一)uuid uuid有两种包: github.com/ ...

  9. Android Studio 常见问题 与 操作指南

    安装 自动选择好了 jre 每次安装下载 一 .常见问题 1. Error while waiting for device: The emulator process for AVD Pixel_4 ...

最新文章

  1. Bio-protocol首届生物实验短视频大赛
  2. Linux-进程内存占用情况
  3. asp开发中存储过程应用全接触 _asp技巧
  4. 怎么会执行sql 懒加载 没用_太神奇的 SQL 查询经历,group by 慢查询优化!
  5. 无人机飞控开发平台培训理论课程——飞行原理
  6. 嵌入式论文3000字_SCI英文论文一般多少字
  7. java文件比较_Java 比较两个任意文件是否相同
  8. 编译安装Apache、php、xcache、FastCGI及相关整合
  9. mate20html查看器,华为Mate20系列迎重大升级 系统支持方舟编译器
  10. Python文件之----CSV
  11. 11.无限分类表的数据库设计
  12. RBF神经网络——案例二
  13. 微型计算机系统性能优化及测试,第八章 微型计算机系统的测试、优化和升级.doc...
  14. python里offset啥意思_深度理解Jquery 中 offset() 方法
  15. 无线局域网安全(一)———WEP加密
  16. win10应用闪退解决方法
  17. 电脑jpg图片怎么批量转换成png
  18. maven自定义插件-mojo标注和参数
  19. 腾讯云对象存储的完整教程,java将文件上传到腾讯云上后返回可以访问的连接
  20. 雷电、夜神、天天、逍遥等模拟器中找不到要下载的软件解决方法

热门文章

  1. 微软 .net 你更新这么快IDE vs2015 、语法糖 6.0、framework、‘吹得这么牛,然并用...
  2. linux挂载NTFS硬盘
  3. 华为光模块,华为光纤模块,华为单模光模块,华为多模光模块,华为千兆光模块
  4. 抄袭事件果然是机器人程序所为
  5. Web Form调用Windows Form的控件
  6. 静脉阻塞指标+补充笔记
  7. sas ondemand for academics使用
  8. colab中安装lightgbm的GPU版本
  9. Failed to find data source: text
  10. 09_Fibonacci