教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Golang-context

Golang-context

发布时间:2021-04-12   编辑:jiaochengji.com
教程集为您提供Golang-context等资源,欢迎您收藏本站,我们将为您提供最新的Golang-context资源

Golang_context

  • 1. context 的作用
    • 1.1 context 相关 API
      • 1.1.2 context
        • Done() <-chan struct{}
        • Deadline() (deadline time.Time, ok bool)
        • Err() error
        • Value(key interface{}) interface{}
      • 1.1.3 emptyCtx
      • 1.1.4 context 的继承衍生
        • WithCancel(parent Context) (ctx Context, cancel CancelFunc)
        • WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)
        • WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
        • WithValue(parent Context, key, val interface{}) Context
      • 1.1.5 其他函数
        • Background()
        • WithCancel(parent Context) (ctx Context, cancel CancelFunc)
  • 2. 为什么要添加 context 相关包?
    • 2.1 context 的出现背景
      • 2.1.1 使用 WaitGroup 控制并发 goroutine——被动等待 goroutine 的结束,无法主动结束 goroutine
      • 2.1.2 使用 select chan 机制控制并发 goroutine——实现流程过于复杂
      • 2.1.3 使用 context 控制并发 goroutine——主动控制,内置,轻量
  • 3. context 的相关用法
    • 3.1 context 的使用原则
    • 3.2 使用 context 控制单个 goroutine
    • 3.3 使用 context 控制多个 goroutine
    • 3.4 使用 context 传递元数据

Go语言实战笔记(二十)| Go Context
深度解密Go语言之context

1. context 的作用

context 是 Golang 提供的一种 goroutine 的管理机制,用于管理继承自"根 goroutine"的所有子 goroutine 的启动、停止等其他生命周期活动。可以理解为 goroutine 的上下文。
在初始状态时,需要创建一个根 context,再由这个根 context 衍生出其他的子 context,其他子 context 执行结束厚,就可以结束根 context 了。

1.1 context 相关 API


1.1.2 context

type Context interface {
    // 当 context 被取消或者到了 deadline,返回一个被关闭的 channel
    Done() <-chan struct{}

    // 在 channel Done 关闭后,返回 context 取消原因
    Err() error

    // 返回 context 是否会被取消以及自动取消时间(即 deadline)
    Deadline() (deadline time.Time, ok bool)

    // 获取 key 对应的 value
    Value(key interface{}) interface{}
}

Done() <-chan struct{}

当 context 被取消或者到了 deadline,返回一个被关闭的 channel

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

Err() error

Value(key interface{}) interface{}

1.1.3 emptyCtx

type emptyCtx int

func (*emptyCtx) Deadline() (deadline time.Time, ok bool) {
	return
}

func (*emptyCtx) Done() <-chan struct{} {
	return nil
}

func (*emptyCtx) Err() error {
	return nil
}

func (*emptyCtx) Value(key interface{}) interface{} {
	return nil
}

1.1.4 context 的继承衍生

有了如上的根Context,那么是如何衍生更多的子Context的呢?这就要靠context包为我们提供的With系列的函数了。

func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
func WithValue(parent Context, key, val interface{}) Context

WithCancel(parent Context) (ctx Context, cancel CancelFunc)

WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)

WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)

WithValue(parent Context, key, val interface{}) Context

1.1.5 其他函数

Background()

context.Background() 返回一个空的Context,这个空的Context一般用于整个Context树的根节点

WithCancel(parent Context) (ctx Context, cancel CancelFunc)

context.WithCancel(parent Context) 创建一个可取消的子Context

2. 为什么要添加 context 相关包?

2.1 context 的出现背景

Golang Context,Golang 程序的上下文,相关 API 拥有完整控制 Golang 程序执行时机的能力,主要用作控制 Goroutine 的执行

2.1.1 使用 WaitGroup 控制并发 goroutine——被动等待 goroutine 的结束,无法主动结束 goroutine

context_test.go Test_Control_Goroutine_WaitGroup

2.1.2 使用 select chan 机制控制并发 goroutine——实现流程过于复杂

context_test.go Test_Control_Goroutine_Select_Chan

2.1.3 使用 context 控制并发 goroutine——主动控制,内置,轻量

3. context 的相关用法

3.1 context 的使用原则

3.2 使用 context 控制单个 goroutine

context_test.go Test_Context_Control_One_Goroutine

3.3 使用 context 控制多个 goroutine

context_test.go Test_Context_Control_Multi_Goroutine

3.4 使用 context 传递元数据

到此这篇关于“Golang-context”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
Golang-context
Golang Context 原理与实战
Golang Context 是好的设计吗?
Go之context包的分析
【go】context
golang context机制
golang Context内部关系梳理
理解 golang 中的 context(上下文) 包
深入理解Golang之Context(可用于实现超时机制)
Go语言并发模型:使用 context

[关闭]
~ ~