编程语言中的 context 是什么?

最近在看 CSAPP3e,看到讲 context,想起这个概念在学习编程的时候经常遇到,却没有一个准确清晰的定义。随着在工作中逐渐积累, 才有一些感觉。准确的来说,context,就是一堆状态(state)。举几个例子来看不同场景下的 context:

进程/线程切换:进程切换的时候,需要保存当前进程的状态,包括寄存器、内存等,这些状态就是 context。

进程切换

对于进程来说,操作系统把它切换以后,未来的某个时刻还需要切换回来恢复执行,恢复执行所需要的状态,就是进程的上下文。

函数调用:函数调用的时候,需要保存当前函数的状态,包括参数、局部变量、返回地址等,这些状态就是 context。

int add(int a, int b) {
    return a + b;
}

int main() {
    int c = add(1, 2);
    return 0;
}

在调用 add 函数的时候,需要保存当前函数的状态,包括参数 ab,返回地址等,这些状态就是函数的上下文。

Go语言中的 context, 比如GIN框架中的 gin.Context,用来在请求之间传递上下文信息,这个上下文信息就是 context。

func Ping(c *gin.Context) {
    c.JSON(200, gin.H{
        "message": "pong",
    })
}

我们可以把一些状态信息放到 gin.Context 中,然后在对应的请求处理函数中获取这些状态信息,比如当前用户信息,请求参数等。

Python 中的 contextlib 模块:Python 中的 contextlib 模块,用来管理上下文,这个上下文就是 context。

from contextlib import contextmanager

@contextmanager
def tag(name):
    print("<%s>" % name)
    yield
    print("</%s>" % name)

with tag("h1"):
    print("hello")

这个例子中,tag 函数返回一个上下文管理器,with 语句中的代码块会在进入和退出上下文的时候执行,这个上下文就是 context。

因此,我们可以这样理解:context 就是一堆状态(state),在不同的场景下,context 的具体内容和作用是不同的,但是都是用来保存和传递状态信息的。


更多文章
  • MySQL性能指标
  • 使用Dropbox来备份服务器文件
  • 《计算机网络-系统方法》读书笔记
  • Y Combinator《如何创业》笔记
  • Go类型嵌套
  • etcd源码阅读与分析(五):mvcc
  • etcd源码阅读与分析(四):lease
  • 干了这碗叔本华牌毒鸡汤 --- 《人生的智慧》
  • etcd源码阅读与分析(三):wal
  • Memory leak in net/http
  • etcd源码阅读与分析(二):raft
  • etcd源码阅读与分析(一):raftexample
  • 虚拟机里的Ubuntu sudo时卡住
  • Go访问私有变量
  • Raft论文阅读笔记