go语言context

时间:2024-04-22 22:34:00

context在服务端编程基本都贯穿所有,
Context 是请求的上下文信息。对于RPC Server来说,一般每接收一个新的请求,会产生一个新的Context,在进行内部的函数调用的时候,通过传递Context,可以让不同的函数、协程保持相同的上下文信息,以达到数据传递、流程控制的目的。
Context 有很多实现,没有一个标准规定Context应该是什么样的。有众多实现版本,如:

  1. 百度的GDP v1框架也有自己Context。
  2. Go的标准库里的context package 有一套实现:context.Context。
  3. 开源的 Gin、Echo、Beego等框架都设计了自己的Context。

这些不同的实现,有一个相同点,他们都是用来处理一次请求(Request)过程中的相关业务处理,但是其提供的功能却有些差别:
在这里插入图片描述

Context的数据以一种链表数据结构进行存储,如添加超时、取消、数据都会新在原来的Context的基础上派生出一个新的Context。不会对原来的Context修改。
其数据结构、信号的传递、数据查找的顺序如下图所示:
在这里插入图片描述

目前context的最佳实践如下:

  1. 每产生一个新的请求,产生一个新的Context
  2. Context作为所有函数的第一个参数,逐层传递
  3. 下层通过判断Context的状态来判断程序是否继续执行还是终止。
    下图是在一个RPC Server中Context的使用情况:
    在这里插入图片描述

记一个讲解context比较详细的地址:
https://www.jb51.net/article/264561.htm