图解图解Go语言的语言的context了解编程语言核心实现源码了解编程语言核心实现源码
基础筑基基础筑基
基于线程的编程语言中的一些设计基于线程的编程语言中的一些设计
ThreadGroup
ThreadGroup是基于线程并发的编程语言
中常用的一个概念,当一个线程派生出一个子线程后通常会加入父线程的线程组(未指定线程组的情况下)中, 最后可以通过ThreadGroup来控制一组线程的退出等操作, 然后在go语言
中goroutine没有明确的这种parent/children的关系,如果想退出当前调用链上的所有goroutine则需要用到context
ThreadLocal
在基于线程的编程语言语言中,通常可以基于ThreadLocal来进行一些线程本地的存储,本质上是通过一个Map来进行key/value的存储,而在go里面并没有ThreadLocal的设计,在
key/value传递的时候,除了通过参数来进行传递,也可以通过context来进行上下文信息的传递
context典型应用场景典型应用场景
场景场景 实现实现 原理原理
上下文信息传递 WithValue 通过一个内部的key/value属性来进行键值对的保存,不可修改,只能通过覆盖的方式来进行值得替换
退出通知 WithCancel 通过监听通知的channel来进行共同退出的通知
上下文数据的递归获取上下文数据的递归获取
因为在go的context里面并没有使用map进行数
据保存,所以实际获取的时候,是从当前层开始逐层的进行向上递归,直至找到某个匹配的key
其实我们类比ThreadGroup,因为goroutine本身并没有上下级的概念,但其实我们可以通过context来实现传递数据的父子关系,可以在一个goroutine中设定context数据,然后传递
给派生出来的goroutine
取消的通知取消的通知
评论0