浅谈Golang上下文Context

简介: 浅谈Golang上下文Context

Context

前言

Golang底层原理剖析之上下文Context


  1. context 主要用来在 goroutine 之间传递上下文信息 - 取消信号、超时时间、截止时间、k-v 等
  2. Context上下文 - 结合Linux操作系统的CPU上下文切换/子进程与父进程进行理解
  3. 如何优雅地使用context - 与select配合使用,管理协程的生命周期
  4. Context的底层实现是什么? - mutex与channel的结合,前者用于初始部分参数,后者用于通信


代码

package main
import (
  "context"
  "fmt"
  "time"
)
// Tip: 通过 cancel 主动关闭
func ctxCancel() {
  ctx, cancel := context.WithCancel(context.Background())
  go func(ctx context.Context) {
    select {
    case <-ctx.Done():
      fmt.Println(ctx.Err())
    case <-time.After(time.Millisecond * 100):
      fmt.Println("Time out")
    }
  }(ctx)
  cancel() //外部调用cancel(),其ctx.Done()将会接收到channel信息
}
// Tip: 通过超时,自动触发
func ctxTimeout() {
  ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*10) //10毫秒后会自动触发
  // 主动执行cancel,也会让协程收到消息
  defer cancel()
  go func(ctx context.Context) {
    select {
    case <-ctx.Done():
      fmt.Println(ctx.Err())
    case <-time.After(time.Millisecond * 100):
      fmt.Println("Time out")
    }
  }(ctx)
  time.Sleep(time.Second)
}
// Tip: 通过设置截止时间,触发time out
func ctxDeadline() {
  ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(10*time.Millisecond))
  defer cancel()
  go func(ctx context.Context) {
    select {
    case <-ctx.Done():
      fmt.Println(ctx.Err())
    case <-time.After(time.Millisecond * 100):
      fmt.Println("Time out")
    }
  }(ctx)
  time.Sleep(time.Second)
}
// Tip: 用Key/Value传递参数,可以浅浅封装一层,转化为自己想要的结构体
func ctxValue() {
  ctx := context.WithValue(context.Background(), "user", "wxf")
  go func(ctx context.Context) {
    v, ok := ctx.Value("user").(string)
    if ok {
      fmt.Println("pass user value", v)
    }
  }(ctx)
  time.Sleep(time.Second)
}

注意点

子节点覆盖父节点数据的情况


最好不要直接使用stirng,int这种基础类型作为key,而是用自定义类型包装一下



valueCtx通过context形成了一个链表结构,不过需要注意,context本身是本着不可改变的模式设计的,所以不要试图修改ctx里面保存的值


目录
相关文章
|
18小时前
|
存储 SQL 安全
Golang底层原理剖析之上下文Context
Golang底层原理剖析之上下文Context
65 0
|
17小时前
|
数据管理 Go 开发者
Golang深入浅出之-Go语言上下文(context)包:处理取消与超时
【4月更文挑战第25天】Go语言中的`context`包在并发、网络请求和长任务中至关重要,提供取消、截止时间和元数据管理。本文探讨`context`基础,如`Background()`、`TODO()`、`WithCancel()`、`WithDeadline()`和`WithTimeout()`。常见问题包括不当传递、过度使用`Background()`和`TODO()`以及忽略错误处理。通过取消和超时示例,强调正确传递上下文、处理取消错误和设置超时以提高应用健壮性和响应性。正确使用`context`是构建稳定高效Go应用的关键。
22 1
|
17小时前
|
Go 开发者
Golang深入浅出之-Go语言上下文(context)包:处理取消与超时
【4月更文挑战第23天】Go语言的`context`包提供`Context`接口用于处理任务取消、超时和截止日期。通过传递`Context`对象,开发者能轻松实现复杂控制流。本文解析`context`包特性,讨论常见问题和解决方案,并给出代码示例。关键点包括:1) 确保将`Context`传递给所有相关任务;2) 根据需求选择适当的`Context`创建函数;3) 定期检查`Done()`通道以响应取消请求。正确使用`context`包能提升Go程序的控制流管理效率。
21 1
|
7月前
|
监控 安全 Go
Golang 语言中 Context 的使用方式
Golang 语言中 Context 的使用方式
24 0
|
18小时前
|
监控 安全 Go
golang面试:golang中的context(四)
golang面试:golang中的context(四)
44 0
|
7月前
|
存储 SQL 安全
Golang 语言标准库 context 包控制 goroutine
Golang 语言标准库 context 包控制 goroutine
29 0
|
7月前
|
Go API 调度
No.14 Golang中Context你了解吗?(下)
No.14 Golang中Context你了解吗?
|
7月前
|
Go
No.14 Golang中Context你了解吗?(上)
No.14 Golang中Context你了解吗?
|
17小时前
|
监控 算法 Go
Golang深入浅出之-Go语言中的服务熔断、降级与限流策略
【5月更文挑战第4天】本文探讨了分布式系统中保障稳定性的重要策略:服务熔断、降级和限流。服务熔断通过快速失败和暂停故障服务调用来保护系统;服务降级在压力大时提供有限功能以保持整体可用性;限流控制访问频率,防止过载。文中列举了常见问题、解决方案,并提供了Go语言实现示例。合理应用这些策略能增强系统韧性和可用性。
48 0
|
18小时前
|
分布式计算 Java Go
Golang深入浅出之-Go语言中的分布式计算框架Apache Beam
【5月更文挑战第6天】Apache Beam是一个统一的编程模型,适用于批处理和流处理,主要支持Java和Python,但也提供实验性的Go SDK。Go SDK的基本概念包括`PTransform`、`PCollection`和`Pipeline`。在使用中,需注意类型转换、窗口和触发器配置、资源管理和错误处理。尽管Go SDK文档有限,生态系统尚不成熟,且性能可能不高,但它仍为分布式计算提供了可移植的解决方案。通过理解和掌握Beam模型,开发者能编写高效的数据处理程序。
139 1