编程语言中的 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 的具体内容和作用是不同的,但是都是用来保存和传递状态信息的。


更多文章
  • 后端工程师学前端(五): SASS
  • 后端工程师学前端(四): CSS进阶(盒子模型)
  • 读《投资中最简单的事》
  • 后端工程师学前端(三): CSS进阶(特指度、单位和字体族)
  • 后端工程师学前端(二): CSS基础知识(规则与选择器)
  • Swift语法笔记
  • 读《管理的实践》
  • 后端工程师学前端(一): HTML
  • frp 源码阅读与分析(二):TCP内网穿透的实现
  • 五天不用微信 - 爽得很
  • frp 源码阅读与分析(一):流程和概念
  • 学习frp源码之简洁的在两个connection之间转发流量
  • 自己动手写一个反向代理
  • 读《债务危机》
  • 从XMonad迁移到i3