您好,欢迎访问一九零五行业门户网

golang context用来干吗

context在go1.7之后就进入标准库中了。它主要的用处如果用一句话来说,是在于控制goroutine的生命周期。当一个计算任务被goroutine承接了之后,由于某种原因(超时,或者强制退出)我们希望中止这个goroutine的计算任务,那么就用得到这个context了。              (推荐学习:go)
对于 golang 开发者来说context(上下文)包一定不会陌生。但很多时候,我们懒惰的只是见过它,或能起到什么作用,并不会去深究它。
应用场景:在 go http 包的 server 中,每一个请求在都有一个对应的goroutine去处理。
请求处理函数通常会启动额外的goroutine用来访问后端服务,比如数据库和 rpc 服务。
用来处理一个请求的goroutine通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息、验证相关的 token、请求的截止时间。
当一个请求被取消或超时时,所有用来处理该请求的goroutine都应该迅速退出,然后系统才能释放这些goroutine占用的资源
context 原理
context 的调用应该是链式的,通过withcancel,withdeadline,withtimeout或withvalue派生出新的 context。当父 context 被取消时,其派生的所有 context 都将取消。
通过context.withxxx都将返回新的 context 和 cancelfunc。调用 cancelfunc 将取消子代,移除父代对子代的引用,并且停止所有定时器。未能调用 cancelfunc 将泄漏子代,直到父代被取消或定时器触发。go vet工具检查所有流程控制路径上使用 cancelfuncs。
遵循规则
遵循以下规则,以保持包之间的接口一致,并启用静态分析工具以检查上下文传播。
不要将 contexts 放入结构体,相反context应该作为第一个参数传入,命名为ctx。 func dosomething(ctx context.context,arg arg)error { // ... use ctx ... }
即使函数允许,也不要传入nil的 context。如果不知道用哪种 context,可以使用context.todo()。
使用context的value相关方法只应该用于在程序和接口中传递的和请求相关的元数据,不要用它来传递一些可选的参数
相同的 context 可以传递给在不同的goroutine;context 是并发安全的。
以上就是golang context用来干吗的详细内容。
其它类似信息

推荐信息