当前位置: 首页 > news >正文

golang context上下文

文章目录

  • 一、为什么需要context
  • 二、context 接口
  • 三、Background 方法
  • 四、 with 系列函数
    • 1、WithCancel 方法
    • 2、WithDeadline 方法
    • 3、WithTimeout 方法
    • 4、WithValue 方法
  • 五、使用注意事项

一、为什么需要context

在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理。请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务。

用来处理一个请求的 goroutine 通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息、验证相关的token、请求的截止时间。 当一个请求被取消或超时时,所有用来处理该请求的 goroutine 都应该迅速退出,然后系统才能释放这些 goroutine 占用的资源。

二、context 接口

context.Context是一个接口,该接口定义了四个需要实现的方法。

语法:


type Context interface {Deadline() (deadline time.Time, ok bool)Done() <-chan struct{}Err() errorValue(key interface{}) interface{}
}方法解释:Deadline():返回当前Context被取消的时间,也就是完成工作的截止时间(deadline);Done():返回一个Channel,这个Channel会在当前工作完成或者上下文被取消之后关闭,多次调用Done方法会返回同一个Channel;Err():返回当前Context结束的原因,它只会在Done返回的Channel被关闭时才会返回非空的值;如果当前Context被取消就会返回Canceled错误;如果当前Context超时就会返回DeadlineExceeded错误;Value():从Context中返回键对应的值,对于同一个上下文来说,多次调用Value 并传入相同的Key会返回相同的结果;

三、Background 方法

语法:


context.Background() Context

分析: Background()主要用于main函数、初始化以及测试代码中,作为Context这个树结构的最顶层的Context,也就是根Context。

四、 with 系列函数

1、WithCancel 方法

WithCancel返回带有新Done通道的父节点的副本。当调用返回的cancel函数或当关闭父上下文的Done通道时,将关闭返回的上下文的Done通道。

语法:


func WithCancel(parent Context) (ctx Context, cancel CancelFunc)

2、WithDeadline 方法

返回父上下文的副本,并将deadline调整为不迟于d。如果父上下文的deadline已经早于d,则WithDeadline(parent, d)在语义上等同于父上下文。当截止日过期时或调用返回的cancel函数时或当父上下文的Done通道关闭时,返回上下文的Done通道将被关闭,以最先发生的情况为准。

语法:


func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)

3、WithTimeout 方法

WithTimeout返回WithDeadline(parent, time.Now().Add(timeout))

语法:


func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)

4、WithValue 方法

WithValue函数能够将请求作用域的数据与 Context 对象建立关系。WithValue返回父节点的副本,其中与key关联的值为val。

语法:


func WithValue(parent Context, key, val interface{}) Context 

五、使用注意事项

  1. 推荐以参数的方式显示传递Context
  2. 以Context作为参数的函数方法,应该把Context作为第一个参数。
  3. 给一个函数方法传递Context的时候,不要传递nil,如果不知道传递什么,就使用context.Background()
  4. Context的Value相关方法应该传递请求域的必要数据,不应该用于传递可选参数
  5. Context是线程安全的,可以放心的在多个goroutine中传递
http://www.lryc.cn/news/3563.html

相关文章:

  • Linux---Linux是什么
  • C语言(Tgmath.h库(C99),exit和atexit)
  • LeetCode 刷题系列 -- 739. 每日温度
  • 如何生成毕业论文的目录和创建模板
  • 新来的23岁软件测试员上来秀了波操作,把几个老员工看傻了
  • Window10开放某个端口
  • 进阶7 分页查询
  • 利用升序定时器链表处理非活动连接
  • MySQL 开发规范
  • 【C语言进阶】预处理与程序环境
  • 【Docker知识】将环境变量传递到容器
  • Allegro如何更改铜皮显示密度操作指导
  • ThinkPHP5酒店预订管理系统
  • 【MySQL】MyCat分库分表分片规则配置详解与实战(MySQL专栏启动)
  • OpenWrt路由器设置域名动态解析手把手教程
  • java流浪动物救助系统(毕业设计)
  • 阿里代码规范插件中,Apache Beanutils为什么被禁止使用?
  • NFC enable NFC使能流程
  • Redis实例绑定CPU物理核优化Redis性能
  • STC15中断系统介绍
  • 力扣HOT100 11-15
  • 深入浅出单调栈与单调队列
  • 深入C语言——实现可变参数函数
  • 41-Dockerfile-Dockerfile简介
  • 【408】操作系统 - 刻骨铭心自测题1(上)
  • 【老卫拆书】009期:Vue+Node肩挑全栈!《Node.js+Express+MongoDB+Vue.js全栈开发实战》开箱
  • 【LeetCode】动态规划总结
  • CAS详解.
  • Mock.js初步使用(浏览器端)
  • opencv保存图片