Go-Context

一、Context 简单介绍context.Context,是专门用来简化对于处理单个请求的多个 goroutine 之间与传递请求数据、同步信号、截止时间等相关操作,这些操作可能涉及多个 API 调用。1-1 应用场景举例e.g.1​ 有一个网络请求 Request,每个 Request 都需要开启一个 goroutine 做一些事情,这些goroutine又可能会开启其他的 gorou...
摘要由CSDN通过智能技术生成

一、Context 简单介绍

context.Context,是专门用来简化对于处理单个请求的多个 goroutine 之间与传递请求数据、同步信号、截止时间等相关操作,这些操作可能涉及多个 API 调用。

1-1 应用场景举例

e.g.1

​ 有一个网络请求 Request,每个 Request 都需要开启一个 goroutine 做一些事情,这些goroutine又可能会开启其他的 goroutine 。我们就可以通过 Context,来跟踪这些 goroutine,并且通过 Context 来控制所有开启的 goroutine 行为。

e.g.2

​ 在 Go 服务器程序中,每个请求都会有一个 goroutine去 处理。
​ 然而,处理程序往往还需要创建额外的 goroutine 去访问后端资源,比如数据库、RPC 服务等。由于这些 goroutine 都是在处理同一个请求,所以它们往往需要访问一些共享的资源,比如用户身份信息、认证 token、请求截止时间等。而且如果请求超时或者被取消后,所有的 goroutine 都应该马上退出并且释放相关的资源。
​ 这种情况也需要用 Context 来为我们取消掉所有 goroutine。

二、控制并发的其他方式

2-1 WaitGroup 等待所有 goroutine 完成

package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
   
	var wg sync.WaitGroup

	wg.Add(2)
	go func() {
   
		time.Sleep(2*time.Second)
		fmt.Println("Finish 1")
		wg.Done()
	}()
	go func() {
   
		time.Sleep(2*time.Second)
		fmt.Println("Finish 2")
		wg.Done()
	}()
	wg.Wait()
	fmt.Println("ok")
}

/*
Finish 2
Finish 1
ok
*/

2-2 goroutine 主动推入和读取 Channel 中状态

手动在 channel 内推入数据和死循环读取,若数据状态改变,则完成 goroutine 等操作。

func main() {
   
	stop := 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值