Go语言中文网,致力于每日分享编码知识,欢迎关注我,会有意想不到的收获!
01
前言
Golang的context的作用就不多说了,就是用来管理调用上下文的,控制一个请求的生命周期。golang的context库里有四个组件。 WithCancel用来控制取消事件,WithDeadline和WithTimeout是控制超时,WithValue可以传递一些key value。
func WithCancel(parent Context) (ctx Context, cancel CancelFunc) func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) func WithValue(parent Context, key, val interface{}) Context
下面的结构图就很形象的说明了各个context 的关联关系。context节点通过children map来连接 子context节点。总之,context节点是层层关联的。
02
如何实现超时和链式关闭
上面的功能介绍倒是没什么,让我好奇的是go context是怎么实现的超时和链式关闭。究其原理,还是要分析context的源代码,WithTimeout也是通过WithDeadline来实现的。
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {return WithDeadline(parent, time.Now().Add(timeout))}
通过下面的WithDeadline方法,我们可以分析出创建一个子context及定时器过程,
context是怎么链式关闭的?
先前分析源码的时候整错了,以为会new一个协程来监听父节点的context的存活。
但想来golang在1.9后内置了context作为标准库, 它不能这么粗暴,现在golang社区里开源库都离不开context方法。为了关闭子节点context,new一个goroutine来监听父节点,这个太不合理。。。想来一定是没有仔细分析代码。。。果然。。。看错了。
总结:
context的源码很简单,代码也精简的,有兴趣的朋友可以细细的琢磨下。
本文作者:rfyiamcool,xiaorui.cc