共计 913 个字符,预计需要花费 3 分钟才能阅读完成。
context 是一个在 golang 中时罕用到的程序包, 特地常见的一个利用场景是由一个申请衍生出的各个 goroutine 之间须要满足肯定的束缚关系,以实现一些诸如有效期,停止 routine 树,传递申请全局变量之类的性能。
比方:
下层须要指定超时的状况: ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond)
下层须要被动勾销的状况:ctx, cancel := context.WithCancel(ctx);须要的中央调用 cancel()
context 应用场景:
参数传递(一组 groutine ctx 共享数据)
超时管制(微服务中申请)
上下文管制(级联勾销 groutine)
context 为什么是线程平安的?
能够晓得增加键值对不是在原 context 构造体上间接增加,而是以此 context 作为父节点,从新创立一个新的 valueCtx 子节点,将键值对增加在子节点上,由此造成一条 context 链。
Context 类型提供了 Done() 办法,每次 context 接管到勾销事件时,该办法都是返回一个 channel,这个 channel 会收到空构造体类型的数据。监听勾销事件也很容易,<- ctx.Done()。
对于 WithTimeout(或者 WithDeadline) 有两种状况
- 一种是产生超时了,这个时候 cancel 会主动调用,资源被开释。
- 另一种没有产生超时,也就是 slowOperation 完结的时候,这个时候须要咱们被动调用 cancel;然而即便没有调用,在过期工夫到了的时候还是会调用 cancel,开释资源。
cancel 即便不被动调用,也不影响资源的最终开释,然而提前被动调用,能够尽快的开释,防止期待过期工夫之间的节约。
倡议还是依照官网的阐明应用,养成良好的习惯,在调用 WithTimeout 之后 defer cancel()
参考:
https://jishuin.proginn.com/p…
https://www.sohamkamani.com/g…
https://mp.weixin.qq.com/s?__…
https://www.jianshu.com/p/c77…