go 上下文:context.Context

这篇具有很好参考价值的文章主要介绍了go 上下文:context.Context。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Go语言中的上下文(Context)是一种用于在 Goroutines 之间传递取消信号、截止时间和其他请求范围值的标准方式。context 包提供了 Context 类型和一些相关的函数,用于在并发程序中有效地传递上下文信息。

在Go语言中,上下文通常用于以下场景:

  1. 请求的传递:当一个请求从客户端发送到服务器时,可以使用上下文来携带与该请求相关的数据。这些数据可以是用户的身份信息、请求的元数据或其他与请求相关的信息。通过将上下文传递给处理该请求的goroutine,可以确保在整个处理过程中访问这些数据。
  2. 取消操作:上下文可以用于取消正在进行的操作。当用户或其他代码发送取消信号时,可以将该信号传递给正在执行操作的goroutine。goroutine在接收到取消信号后,可以根据需要执行清理操作并退出。
  3. 截止时间:有时候需要在一段时间后终止正在进行的操作。通过将截止时间与上下文一起传递给goroutine,可以确保在超过截止时间后执行适当的清理操作并退出。
  4. 跨多个服务通信:当在分布式系统中使用Go语言时,上下文可以用于跨不同的服务之间传递请求数据、取消信号和截止时间。通过使用上下文,可以确保在整个系统中的各个服务之间保持一致的上下文和请求生命周期管理。

通过使用上下文,可以有效地在 Goroutines 之间传递取消信号、截止时间和请求范围的值,从而更好地控制并发程序的行为。

1. context.Context 接口

Context 接口定义了在 Goroutines 之间传递的上下文的基本方法:

type Context interface {
    Deadline() (deadline time.Time, ok bool)
    Done() <-chan struct{}
    Err() error
    Value(key interface{}) interface{}
}
  • Deadline():返回上下文的截止时间。如果存在截止时间,oktrue,否则为 false
  • Done():返回一个通道,该通道关闭时表示上下文被取消或者超过了截止时间。
  • Err():返回上下文取消的原因。如果上下文没有被取消,则返回 nil
  • Value(key):返回与给定 key 关联的值。这允许在上下文中传递请求范围的数据。

2. 创建上下文

在 Go 中,上下文可以通过 context.Background() 创建,它是一个无值的上下文,通常用作根上下文。根上下文不能被取消,也不能传递截止时间。

ctx := context.Background()

可以使用 context.WithCancelcontext.WithTimeoutcontext.WithDeadlinecontext.WithValue 等函数创建派生上下文,这些函数分别用于创建带有取消、超时、截止时间和值的上下文。

// 创建一个带有取消功能的上下文
ctx, cancel := context.WithCancel(context.Background())

// 创建一个带有超时的上下文
ctx, cancel := context.WithTimeout(context.Background(), time.Second)

// 创建一个带有截止时间的上下文
deadline := time.Now().Add(2 * time.Second)
ctx, cancel := context.WithDeadline(context.Background(), deadline)

// 创建一个带有值的上下文
key := "key"
value := "value"
ctx := context.WithValue(context.Background(), key, value)

3. 传递上下文

在 Go 中,通过函数参数将上下文传递给调用的函数,从而使调用的函数能够感知上下文的取消或超时。例如:

func myFunction(ctx context.Context) {
    // 在这里使用 ctx 处理逻辑
    select {
    case <-ctx.Done():
        // 上下文被取消,执行清理工作
        fmt.Println("Context canceled")
        return
    default:
        // 继续正常的逻辑
        fmt.Println("Doing some work")
    }
}

func main() {
    // 创建带有取消功能的上下文
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    // 启动 Goroutine,传递上下文
    go myFunction(ctx)

    // 主 Goroutine 执行一些工作
    time.Sleep(2 * time.Second)
}

4. 上下文的取消

调用 cancel() 函数会取消与上下文相关的 Goroutines。一旦上下文被取消,与之关联的所有 Goroutines 都会收到取消信号。

ctx, cancel := context.WithCancel(context.Background())

// 启动 Goroutine,传递上下文
go func(ctx context.Context) {
    select {
    case <-ctx.Done():
        // 上下文被取消,执行清理工作
        fmt.Println("Context canceled")
        return
    }
}(ctx)

// 取消上下文
cancel()

5. 上下文的超时和截止时间

使用 context.WithTimeoutcontext.WithDeadline 函数可以设置上下文的超时或截止时间。当超过指定的时间后,上下文会自动取消。

ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()

// 启动 Goroutine,传递上下文
go func(ctx context.Context) {
    select {
    case <-ctx.Done():
        // 上下文超时,执行清理工作
        fmt.Println("Context timeout")
        return
    }
}(ctx)

// 主 Goroutine 执行一些工作
time.Sleep(3 * time.Second)

6. 上下文值

context.WithValue 函数可以用于在上下文中传递请求范围的值。这些值可以通过 context.Value 方法在上下文中检索。

ctx := context.WithValue(context.Background(), "user", "john_doe")

// 从上下文中获取值
value := ctx.Value("user")
fmt.Println(value) // 输出: john_doe

7. 上下文的链式调用

可以通过链式调用的方式,将多个上下文进行组合,形成一个父子关系的上下文链。

parentCtx := context.Background()
ctx1, cancel1 := context.WithTimeout(parentCtx, 2*time.Second)
defer cancel1()

ctx2, cancel2 := context.WithCancel(ctx1)
defer cancel2()

上述的 ctx2ctx1 的子上下文,当 ctx1 超时或被取消时,ctx2 也会相应地被取消。


go 上下文:context.Context

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意文章来源地址https://www.toymoban.com/news/detail-746288.html


到了这里,关于go 上下文:context.Context的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是层叠上下文(stacking context)?它是如何形成的?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月12日
    浏览(21)
  • HarmonyOS/OpenHarmony(Stage模型)卡片开发应用上下文Context使用场景二

    3.创建其他应用或其他Module的Context 基类Context提供创建其他应用或其他Module的Context的方法为createModuleContext(moduleName:string),创建其他应用或者其他Module的Context,从而通过该Context获取相应的资源信息(例如获取其他Module的获取应用开发路径信息)。 调用createModuleContext(moduleNa

    2024年02月11日
    浏览(29)
  • HarmonyOS/OpenHarmony(Stage模型)卡片开发应用上下文Context使用场景一

    1.获取应用文件路径 基类Context提供了获取应用文件路径的能力,ApplicationContext、AbilityStageContext、UIAbilityContext和ExtensionContext均继承该能力。应用文件路径属于应用沙箱路径。上述各类Context获取的应用文件路径有所不同。 通过ApplicationContext获取应用级别的应用文件路径,此路

    2024年02月11日
    浏览(27)
  • React Native Ref转发/Memo缓存/HOC高阶组件/Context上下文

    1、使用自定义组件时,实现外层组件对原始组件(TextInput)的操作 外层组件使用 ref 属性 子组件使用 forwardRef 包裹 2、函数式组件对外暴露实例方法(cusomFocus) 子组件 父组件如图一所示 1 、 避免多余渲染 问题:每次点击按钮都会导致 InfoView 组件发生重绘,即使每次 setI

    2024年01月21日
    浏览(28)
  • [元带你学: eMMC协议 31] eMMC Context(上下文) ID 详解 | eMMC 并行数据标识与隔离详解

    依JEDEC eMMC及经验辛苦整理,原创保护,禁止转载。 专栏 《元带你学:eMMC协议》 内容摘要 全文 5000 字, 主要内容 eMMC 为什么要引入 Context? Context 是什么? 如何使用Context 上下文? Context 上下文配置怎么做? 上下文 ID 应用局限 系统层和芯片组对 Context ID 支持情况 应用层软

    2024年02月11日
    浏览(20)
  • Yolov8涨点神器:注意力机制---多头上下文集成(Context Aggregation)的广义构建模块,助力小目标检测,暴力涨点

    目录 2.Context Aggregation介绍  3. Yolov8引入ContextAggregation 3.1 修改modules.py中 3.2 注册tasks.py模块 3.3  yolov8_ContextAggregation.yam

    2024年02月06日
    浏览(41)
  • Yolov5涨点神器:注意力机制---多头上下文集成(Context Aggregation)的广义构建模块,助力小目标检测,暴力涨点

    目录  1.数据集性能验证 2.Context Aggregation介绍  3. Yolov5引入ContextAggregation 3.1 修改common.py 3.2 注册yolo.py模块

    2024年02月07日
    浏览(23)
  • [go语言基础]关于上下文机制

    关于什么为上下文机制 一般来说,我们如果想要在多个进程中监听彼此,最常用的方法就是使用管道进行监听 例如最常用的,想要在进程之间传递某个进程已经完成的信号,我们经常使用通道的方式进行传递消息. 举个例子,一个进程B想要监听另一个进程A,可以通过一个管道进行监

    2024年02月09日
    浏览(20)
  • 无限上下文,多级内存管理!突破ChatGPT等大语言模型上下文限制

    目前,ChatGPT、Llama 2、文心一言等主流大语言模型,因技术架构的问题上下文输入一直受到限制,即便是Claude 最多只支持10万token输入,这对于解读上百页报告、书籍、论文来说非常不方便。 为了解决这一难题,加州伯克利分校受操作系统的内存管理机制启发,提出了MemGPT。

    2024年02月06日
    浏览(34)
  • flask中的应用上下文

    flask中的应用上下文 Flask应用上下文主要包含两个对象: current_app 和 g 。这两个对象在处理请求期间都是全局可访问的,但在每个请求结束时都会被重置。 current_app :这是当前激活的Flask应用的实例。在大多数情况下,你可以将其视为应用的全局实例。然而,当你在处理多个

    2024年02月14日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包