Go的Context(Goroutine 上下文)

题外话

周日了,休息,明天就又要上班了,昨晚吃的北极深海贝,可能是太深了或者是太冷了,拉肚子了,现在的我坐在这镶嵌了64颗南非水钻的马桶上,苦苦沉思究竟是换个厨师还是换个后厨……
又是乏味的一天…… 人生就是这么简简单单
话说今天又是阳光普照的一天,真不错

在这里插入图片描述
废话不多说,上货
在这里插入图片描述

程序上下文

程序上下文并不是实际存在的一个事物,所以一开始的时候我也不是很明白,后来看到了一篇博客,里面提到了一个社区回答的例子,

举个例子
在这里插入图片描述
场景1:
小美刚转学到我们学校,我暗恋了她很久,有一天鼓足勇气,向她表白,小美气呼呼对我说:“你去死吧”,我当时就哭了。
场景2
我跟小美从小青梅竹马,后来我得了白血病,不忍心让小美跟着一起受苦,于是偷偷的一个人走掉,小美在一火车站找到了我,小美气呼呼对我说:“你去死吧”,我当时哭了。

这是上文,下文是:

场景1:
其实小美是同父异母的妹妹

场景2: 
其实根本没有小美,小美很久以前就死了,是我小学同学,我忘不掉她,产生了幻觉。
哦对了,我们家族有罕见的精神病史。
场景3:
小美其实是个男的,有性别认同障碍症。

可见,所谓上下文,就是当时运行的环境本身。

注:摘自segmentfualt社区用户 愤怒的小白
可能例子不是很好懂,那我们换个例子,来自知乎
一般来说是想要有个object来保存状态,想不出好的名字然后就叫context了
来自----------某个知乎的匿名用户

Context 也叫作“上下文”,是一个比较抽象的概念,一般理解为程序单元的一个运行状态、现场、快照。其中上下是指存在上下层的传递,上会把内容传递给下,

Go的Context

Context 在 Go1.7 之后就加入到了Go语言标准库中,准确说它是 Goroutine 的上下文,包含 Goroutine 的运行状态、环境、现场等信息。
随着 Context 包的引入,标准库中很多接口因此加上了 Context 参数,例如 database/sql 包,Context 几乎成为了并发控制和超时控制的标准做法。

每个 Goroutine 在执行之前,都要先知道程序当前的执行状态,通常将这些执行状态封装在一个 Context 变量中,传递给要执行的 Goroutine 中。
在网络编程下,当接收到一个网络请求 Request,在处理 Request 时,我们可能需要开启不同的 Goroutine 来获取数据与逻辑处理,即一个请求 Request,会在多个 Goroutine 中处理。而这些 Goroutine 可能需要共享 Request 的一些信息,同时当 Request 被取消或者超时的时候,所有从这个 Request 创建的所有 Goroutine 也应该被结束。

Context 接口

Context 包的核心就是 Context 接口,其定义如下:

type Context interface {
    Deadline() (deadline time.Time, ok bool)
    Done() <-chan struct{}
    Err() error
    Value(key interface{}) interface{}
}
  • Deadline 方法需要返回当前 Context 被取消的时间,也就是完成工作的截止时间(deadline);
  • Done 方法需要返回一个 Channel,这个 Channel 会在当前工作完成或者上下文被取消之后关闭,多次调用 Done方法会返回同一个Channel;
  • Err 方法会返回当前 Context 结束的原因,它只会在 Done 返回的 Channel 被关闭时才会返回非空的值:
  • 如果当前 Context 被取消就会返回 Canceled 错误;
  • 如果当前 Context 超时就会返回 DeadlineExceeded 错误; Value 方法会从 Context
  • 中返回键对应的值,对于同一个上下文来说,多次调用 Value 并传入相同的 Key 会返回相同的结果,该方法仅用于传递跨 API和进程间跟请求域的数据。

你以为结束了

小问题:如何使用这个Context?
在这里插入图片描述
大家看完发现有什么错误,写在下面吧!跟我黑虎阿福比划比划!
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值