与context的关系_Go中的Context超时和关闭是如何实现的呢?

Go语言中文网,致力于每日分享编码知识,欢迎关注我,会有意想不到的收获!

2c5861b753e11ec61ff78363d8ff0a52.png

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节点是层层关联的。

218220a247d6acc4f50bb299309aee02.png

02

如何实现超时和链式关闭

上面的功能介绍倒是没什么,让我好奇的是go context是怎么实现的超时和链式关闭。究其原理,还是要分析context的源代码,WithTimeout也是通过WithDeadline来实现的。

func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {return WithDeadline(parent, time.Now().Add(timeout))}

通过下面的WithDeadline方法,我们可以分析出创建一个子context及定时器过程,

5f15bf5e7eb9a8b0ecf8985be5658034.png

context是怎么链式关闭的?

先前分析源码的时候整错了,以为会new一个协程来监听父节点的context的存活。

04c030fb552fdc7eff8f4f90504a566c.png

但想来golang在1.9后内置了context作为标准库, 它不能这么粗暴,现在golang社区里开源库都离不开context方法。为了关闭子节点context,new一个goroutine来监听父节点,这个太不合理。。。想来一定是没有仔细分析代码。。。果然。。。看错了。

fb750fbabb15aae93fcd9459231947f0.png

总结:

context的源码很简单,代码也精简的,有兴趣的朋友可以细细的琢磨下。

本文作者:rfyiamcool,xiaorui.cc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值