go中context的使用场景

使用context在父协程中操作子协程

  • context在go中一般在第一个参数传递
  • context的底层实现是一个树形结构,基于树形结构context有一个比较好的点:关闭父协程时,底层会自动关闭该父协程下的所有子协程,如下示例:基于ctx1继续创建了ctx2,将ctx2传入子协程中, 6s后关闭ctx1, 但ctx1下的ctx2也被关闭了

var wg sync.WaitGroup
func control(ctx context.Context){
   
	defer wg.Done()
	for {
   
		select {
   
		case <-ctx.Done():
			fmt.Println("监控程序退出")
			return
		default:
			fmt.Println("监控信息")
			time.Sleep(time.Second)
			
		}
	}
}
func main() {
   
	wg.Add(1)
	ctx,cancel1 := context.WithCancel(context.Background())
	ctx2, _ := context.WithCancel(ctx)
	go control(ctx2)
	// 6s 退出
	time.Sleep(time.Second*6)
	cancel1()
	//cancel2()
	wg.Wait()
	fmt.Println("母协程退出")
}

context.WithTimeout 自动退出

var wg sync.WaitGroup
func control(ctx context.Context){
   
	defer wg.Done()
	for {
   
		select {
   
		case <-ctx.Done():
			fmt.Println("监控程序退出")
			return
		default:
			fmt.Println("监控信息")
			time.Sleep(time.Second)
			
		}
	}
}
func main() {
   
	wg.Add(1)
	// 自动过期
	ctx,_ := context.WithTimeout(context.Background(),time.Second * 6)
	go control(ctx)
	wg.Wait()
	fmt.Println("母协程退出")
}

context 存储数据

  • context 常用来存储一下与业务无关的数据,如 链路ID
  • 原生的context 的数据是存储在树型结构的每个节点,故不适合存储大量数据
var wg sync.WaitGroup
func control(ctx context.Context){
   
	fmt.Printf("traceid : %v \n",ctx.Value("traceid"))
	defer wg.Done()
	for {
   
		select {
   
		case <-ctx.Done():
			fmt.Println("监控程序退出")
			return
		default:
			fmt.Println("监控信息")
			time.Sleep(time.Second)
			
		}
	}
}
func main() {
   
	wg.Add(1)
	ctx,_ := context.WithTimeout(context.Background(),time.Second * 6)
	ctx = context.WithValue(ctx,"traceid","jjjddddfer")
	go control(ctx)
	wg.Wait()
	fmt.Println("母协程退出")
}

相关推荐

  1. gocontext使用场景

    2024-01-27 18:28:01       50 阅读
  2. Go语言context原理及使用

    2024-01-27 18:28:01       32 阅读
  3. GoContext是什么?

    2024-01-27 18:28:01       60 阅读
  4. go语言-context基本使用

    2024-01-27 18:28:01       52 阅读
  5. GO语言Context作用

    2024-01-27 18:28:01       43 阅读
  6. GO——context

    2024-01-27 18:28:01       58 阅读
  7. GoContext

    2024-01-27 18:28:01       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-27 18:28:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-27 18:28:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-27 18:28:01       82 阅读
  4. Python语言-面向对象

    2024-01-27 18:28:01       91 阅读

热门阅读

  1. 【无标题】OpenAi

    2024-01-27 18:28:01       50 阅读
  2. Docker 的基本概念和优势

    2024-01-27 18:28:01       59 阅读
  3. 第六章(原理篇) 微前端间的通信机制

    2024-01-27 18:28:01       55 阅读
  4. TCP三次握手-普通话版

    2024-01-27 18:28:01       44 阅读
  5. 处理器架构

    2024-01-27 18:28:01       53 阅读
  6. mysql5.7.19安装步骤

    2024-01-27 18:28:01       59 阅读
  7. 文档 OCR 识别优化为异步思路逻辑

    2024-01-27 18:28:01       44 阅读
  8. IDEA中pom中打包引入的jar包

    2024-01-27 18:28:01       66 阅读