go语言context

//context:主要在于Goroutine之间传递的上下文信息,如
//取消信号、超时信号、截止时间信息、key-value值

context{
emptyCtx{
func Background() Context
//它通常由主函数、初始化和测试使用,并作为传入请求的顶级上下文。
func TODO() Context
//TODO返回一个非空的上下文。代码应该使用上下文。当不清楚要使用哪个Context或者它还不可用时(因为周围的函数还没有扩展到接受Context参数)。TODO由静态分析工具识别,这些分析工具确定上下文是否在程序中正确传播。
},
cancelCtx{
func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
//WithCancel返回带有一个新的Done通道的父通道的副本。当返回的cancel函数被调用或父上下文的Done通道被关闭时,返回上下文的Done通道将被关闭,以哪个先发生为准。取消此上下文将释放与其关联的资源,因此在此上下文中运行的操作完成后,代码应立即调/用cancel。

package contextExample

import (
	"context"
	"fmt"
)

func StudyWithCancel() {
	//gen在一个单独的gor例程中生成整数
	//发送它们到返回的通道。
	//gen的调用者需要取消上下文一次
	//它们使用生成的整数不泄漏
	//由gen. exe启动的内部goroutine。
	gen := func(ctx context.Context) <-chan int {
		dst := make(chan int)
		n := 1
		go func() {
			for {
				select {
				case <-ctx.Done():
					return // returning not to leak the goroutine
				case dst <- n:
					n++
				}
			}
		}()
		return dst
	}

	ctx, cancel := context.WithCancel(context.Background())
	defer cancel() // cancel when we are finished consuming integers

	for n := range gen(ctx) {
		fmt.Println(n)
		if n == 5 {
			break
		}
	}
}

	},
	timerCtx{
		func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)
		//WithDeadline返回父上下文的一个副本,其截止日期调整为不迟于d。如果父上下文的截止日期已经早于d, WithDeadline(parent, d)在语义上等价于parent。当截止日期到期、调用返回的cancel函数或父上下文的Done通道被关闭时,返回上下文的Done通道将被关闭,以先发生的情况为准。取消此上下文将释放与其关联的资源,因此在此上下文中运行的操作完成后,代码应立即调用cancel。
package contextExample

import (
	"context"
	"fmt"
	"time"
)

func StudyWithDeadline() {
	d := time.Now().Add(50 * time.Millisecond)
	ctx, cancel := context.WithDeadline(context.Background(), d)

	// Even though ctx will be expired, it is good practice to call its
	// cancelation function in any case. Failure to do so may keep the
	// context and its parent alive longer than necessary.
	defer cancel()

	select {
	case <-time.After(1 * time.Second):
		fmt.Println("overslept")
	case <-ctx.Done():
		fmt.Println(ctx.Err())
	}
}

		func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
		//WithTimeout返回WithDeadline(parent, time.Now(). add (timeout))。取消这个上下文会释放与之相关的资源,所以只要在这个上下文中运行的操作完成,代码就应该调用cancel:
package contextExample

import (
	"context"
	"fmt"
	"time"
)

func StudyWithTimeout() {
	//传递一个带超时的上下文来告诉阻塞函数它
	//应该在超时过后放弃它的工作
	ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)
	defer cancel()

	select {
	case <-time.After(1 * time.Second):
		fmt.Println("overslept")
	case <-ctx.Done():
		fmt.Println(ctx.Err()) // prints "context deadline exceeded"
	}
}

	},
	valueCtx{
		func WithValue(parent Context, key, val interface{}) Context
		//WithValue返回父对象的副本,其中与key关联的值为val。上下文值只用于传递进程和api的请求范围内的数据,而不是传递可选参数给函数。提供的键必须具有可比性,不应该是string类型或任何其他内置类型,以避免使用上下文的包之间的冲突。使WithValue的用户应该定义自己的键类型。在给接口{}赋值时,为了避免分配,上下文键通常有具体的类型struct{}。另外,导出的上下文关键变量的静态类型应该是指针或接口。
package contextExample

import (
	"context"
	"fmt"
)

func StudyWithValue() {
	type favContextKey string

	f := func(ctx context.Context, k favContextKey) {
		if v := ctx.Value(k); v != nil {
			fmt.Println("found value:", v)
			return
		}
		fmt.Println("key not found:", k)
	}

	k := favContextKey("language")
	ctx := context.WithValue(context.Background(), k, "Go")

	f(ctx, k)
	f(ctx, favContextKey("color"))
}

源码地址

	},
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值