golang mysql context_golang中的context上下文

Context是由Golang官方开发的并发控制包,一方面可以用于当请求超时或者取消时候,相关的goroutine马上退出释放资源,

另一方面Context本身含义就是上下文,其可以在多个goroutine或者多个处理函数之间传递共享的信息。

创建一个新的context,必须基于一个父context,新的context又可以作为其他context的父context。

所有context在一起构造成一个context树。

4ef8d33132cf009d3abf7616901c9889.png

package main

import (

"context"

"fmt"

"math/rand"

"runtime"

"time"

)

func main(){

//ctx 超时控制

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

defer cancel()

go SlowOperation(ctx)

go func() {

for {

time.Sleep(300*time.Microsecond)

fmt.Println("goroutine:",runtime.NumGoroutine())

}

}()

time.Sleep(4*time.Second)

}

func SlowOperation(ctx context.Context){

done:=make(chan int,1)

go func() {

dur:=time.Duration(rand.Intn(5)+1)*time.Second

time.Sleep(dur)

done

}()

select {

case

fmt.Println("slowOperation timeout:",ctx.Err())

case

fmt.Println("complete work")

}

}

上面代码会不停打印当前groutine数量,可以观察到SlowOperation函数执行超时之后,goroutine数量由4个变成2个,相关goroutetine退出了

bf494229c5aeee6371a9337fea2d651e.png

type Context interface {

Deadline() (deadline time.Time, ok bool)

Done()

Err() error

Value(key interface{}) interface{}

}

Context接口一共包含四个方法:

Deadline:返回绑定该context任务的执行超时时间,若未设置,则ok等于false

Done:返回一个只读通道,当绑定该context的任务执行完成并调用cancel方法或者任务执行超时时候,该通道会被关闭

Err:返回一个错误,如果Done返回的通道未关闭则返回nil,如果context如果被取消,返回Canceled错误,如果超时则会返回DeadlineExceeded错误

Value:根据key返回,存储在context中k-v数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值