[Go] Golang Context 包的注意点
Golang context 包,定义了context 类型,携带截止日期,取消信号,和其它跨API请求作用域及进程间的值。
到服务器的请求应该创建一个 Context,服务器对外的调用应该接受一个Context。
函数之间的调用链必须传递 Context,可选地可以用 WithCancel、WithDeadline、WithTimeout、WithValue 创建的派生 Context。
当一个 Context 取消了,所有的派生 Context 也同样被取消。
WithCancel, WithDeadline, WithTimeout 函数携带一个Context(父级)并且返回一个派生Context(子级)和一个 CancelFunc。
调用 CancelFunc 取消子级和子子级,移除父级到子级的引用,并停止任务相关的定时器。
无法调用 CancelFunc 让子级和子子级泄露,直到父级被取消或者定时器触发。Go vet 工具检测在所有控制流路径上使用的 CancelFuncs。
使用 Context 的程序应该按照这些规则来保持包之间的接口一致和支持静态分析工具检测Context传播:
1.不把 Context 存到一个结构类型中,而是明确传递到每个需要的方法中。Context 应该是第一个参数,一般命名成 ctx:
func DoSomething(ctx context.Context, arg Arg) error {
// ... use ctx ...
}
2.不要传一个 nil Context,即使函数允许。如果不确定使用哪一个 Context,传递一个 context.TODO
3.只对请求作用域的数据如 传输处理和APIs 使用 context 的值。不是作为可选参数传递给函数。
4. 同一个Context 可以传递给 运行在不同 goroutine 里的函数;Context 同时被多个 goroutine 使用是安全的。
Refer:Go SDK/src/context/context.go
Link:https://www.cnblogs.com/farwish/p/15840531.html
[Go] Golang Context 包的注意点的更多相关文章
- Golang Context 包详解
Golang Context 包详解 0. 引言 在 Go 语言编写的服务器程序中,服务器通常要为每个 HTTP 请求创建一个 goroutine 以并发地处理业务.同时,这个 goroutine 也 ...
- Golang context包解读
Context 通常被译作 上下文 ,一般理解为程序单元的一个运行状态.现场.快照,而翻译中 上下 又很好地诠释了其本质,上下上下则是存在上下层的传递, 上 会把内容传递给 下 . 在Go语言中,程序 ...
- golang context包
go context标准库 context包在Go1.7版本时加入到标准库中.其设计目标是给Golang提供一个标准接口来给其他任务发送取消信号和传递数据.其具体作用为: 可以通过context发送取 ...
- Golang Context 的原理与实战
本文让我们一起来学习 golang Context 的使用和标准库中的Context的实现. golang context 包 一开始只是 Google 内部使用的一个 Golang 包,在 Gola ...
- golang中的context包
标准库的context包 从设计角度上来讲, golang的context包提供了一种父routine对子routine的管理功能. 我的这种理解虽然和网上各种文章中讲的不太一样, 但我认为基本上还是 ...
- golang中context包学习
摘要 go语言中goroutine之间的关联关系,缺乏维护,在erlang中有专门的机制来保障新开仟程的生命周期, 在go语言中,只能通过channel + select来实现,但不够直观,感觉很绕. ...
- 【GoLang】golang context channel 详解
代码示例: package main import ( "fmt" "time" "golang.org/x/net/context" ) ...
- Golang Context 详细介绍
Golang context 本文包含对context实现上的分析和使用方式,分析部分源码讲解比价多,可能会比较枯燥,读者可以直接跳过去阅读使用部分. ps: 作者本着开源分享的精神撰写本篇文章,如果 ...
- golang context 剖析 1.7.4 版本
1. 内部结构之 - timerCtx . type timerCtx struct { cancelCtx timer *time.Timer // Under cancelCtx.mu. dead ...
- 带小伙伴手写 golang context
前言 - context 源码 可以先了解官方 context.go 轮廓. 这里捎带保存一份当前 context 版本备份. // Copyright 2014 The Go Authors. Al ...
随机推荐
- 检验实时3D像素流送平台好坏的七个标准!(下)
上篇文章我们介绍了<检验实时3D像素流送平台质量的七个标准>中的前四个标准,本文我们将继续给您介绍检验像素流送平台质量的其他三个标准. 您的平台是通过云还是仅通过渲染的图像传输数据? 您的 ...
- FTP的配置和管理
实验环境: 两台windows servers 一台已经配置了FTP服务器,IP为192.168.1.220,vmnet1 一台作为客户端测试,IP为192.168.1.138,vmnet1 一:FT ...
- Spring Cloud导入Spring Boot项目当作子模块微服务IDEA不识别子module问题
1.在父工程下面引入module. <modules> <module>study-design-mode</module> </modules> 2. ...
- Kingbase ES 自定义聚合函数和一次改写案例
文章概要: KES的SQL的语法暂时不兼容oracle的自定义聚合函数的创建语法和流程,但是可以使用KES已支持的语法改写. 本文整理和简单解析了自定义聚合函数的原理和解读了范例代码. 并根据客户代码 ...
- 花了100块大洋搞懂 ipv6的用户如何访问ipv4 服务器
大家好,今天蓝胖子花了100多块搞懂了 ipv6的用户如何访问ipv4 服务器,将收获与大家分享下. ipv4和ipv6的协议栈不同,这意味着,其对应的ip包的封装和解析不同,那么只支持ipv4的机器 ...
- 求一个整数的因数分解--Java--小白必懂
public class OJ_1415 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); ...
- MySQL联结
创建联结 mysql> SELECT vend_name,prod_name,prod_price FROM vendors,products WHERE vendors.vend_id=pro ...
- 组合数学——Min-Max容斥
Min-Max 容斥,即 $$\max(S)=\sum_{T\in S,T\neq\emptyset}(-1)^{|T|-1}\min(T)$$ 接下来证明上面那个式子是对的.定义 \(S\) 中共有 ...
- C# 运算符详解:包含算术、赋值、比较、逻辑运算符及 Math 类应用
运算符用于对变量和值执行操作.在C#中,有多种运算符可用,包括算术运算符.关系运算符.逻辑运算符等. 算术运算符 算术运算符用于执行常见的数学运算: int x = 100 + 50; // 加法,结 ...
- C# PropertyChanged 事件-数据绑定
在.NET平台上,数据绑定是一项令人十分愉快的技术.利用数据绑定能减少代码,简化控制逻辑. 通常,可以将某个对象的一个属性绑定到一个可视化的控件上,当属性值改变时,控件上的显示数据也随之发生变化.要实 ...