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


更多文章
  • 如何面试-作为面试官得到的经验
  • 自己写一个容器
  • Golang(Go语言)中实现典型的fork调用
  • 软件开发之禅---大事化小,各个击破
  • 程序员的自我修养:链接,装载与库 阅读笔记
  • Redis源码阅读与分析二:双链表
  • Redis源码阅读与分析三:哈希表
  • Redis源码阅读与分析一:sds
  • Golang runtime 源码阅读与分析
  • Golang的一些坑
  • GC 垃圾回收
  • 设计一个路由
  • Go语言性能优化实战
  • 那些年开发的时候踩过的坑
  • (关系型)数据库优化总结