golang context

1. 内部结构之 - timerCtx 。

type timerCtx struct {
    cancelCtx
    timer *time.Timer // Under cancelCtx.mu.

    deadline time.Time
}

- 里面有一个 timer,用来触发超时之后的 回调函数,也就是超时之后,帮你 cancel 一下。理论上,你不用在结构体里存一份这个,这里存了这个指针,主要是用来取消这个定时触发,基本上就是因为一个定时器你如果不需要了,就要马上回收这个资源,否则会很耗资源的。例如,假设,你有一个十分钟的超时触发机制,不过由于某些原因,这个context被其他东西cancel了,那么这十分钟内,内部的定时器还要继续工作,这难道不是很浪费么,就像你们几个人玩游戏,让一个人记录分数,这时你们上司来了,这个游戏完不成了,难道那个记录分数的同事还傻乎乎的继续记么,,,,很明显太二了,所以要及时的终止这个计时器。

- 这个deadline就是那个预设的超时的绝对时间。同时,实现了Context的 Deadline接口。

- 关键就是里面的 cancelCtx,首先这是一个结构体,不是接口,也不是指针。可以从这个源码里来思考思考,什么时候在struct里面直接用struct,什么时候在里面埋一个interface,什么时候在里面用一个 *struct。把timeCtx分开成两个单词,一个是time,一个是Context,那么上面两个字段承载了有关【time】的东西,那么可以猜到,这个cancelCtx就承载了【Context】的功能。所以来看看这个cancelCtx是个什么鬼?

1.1 cacelCtx 的结构分析。

type cancelCtx struct {
	Context

	done chan struct{} // closed by the first cancel call.

	mu       sync.Mutex
	children map[canceler]bool // set to nil by the first cancel call
	err      error             // set to non-nil by the first cancel call
}

  

- 先来插一句,代码如何抽象,当然是见仁见智,但是这里把cancelCtx放在 timeCtx里面,而且是以 struct的形式,没有用指针,也没有用interface,我认为,,我认为是因为,这个cancelCtx是属于timeCtx的一部分,正是这一部分体现了,timeCtx 确实是一个Context。

- done字段:作为一个Context,必须要有 Done()方法,这个方法要返回一个 chan struct{}, 那么很明显,这个字段就是来干这个的。

- err字段: 同上,作为一个Context,必须要有 Err()方法,,,返回一个错误,很明显,这个字段就是用来干这个的。

- mu字段: 用来保证并发操作的。

- children字段:golang 的 context 包用一种 【父-子】的关系来管理【一个业务需求】引发的【各个子goroutine】所关联的各个【Context】,很明显,这个children字段用来记录,谁是我的儿子。

- Context字段:这是一个接口,用来存放【父Context】。注意到,要想成为 Context必须实现四个方法。最后一个方法就是Value() 。我们发现,现在为止只有三个被实现了,那就是Deadline,Done,Err。那么谁来实现Value呢。。。就是这个埋进来的Context了。也就是说,你作为一个timeCtx,你仅仅有【时间】的概念,你不应该有【Value】的概念,【Value】的概念,你从你的【父Context】那里直接伸手去要,恩,大概就这个意思。{插:这个Context包还讲解了golang的面向对象风格是啥么样的形态,所以说看源码涨知识啊。。}。

时间: 2024-10-13 00:51:43

golang context的相关文章

Golang Context 详细介绍

Golang context 本文包含对context实现上的分析和使用方式,分析部分源码讲解比价多,可能会比较枯燥,读者可以直接跳过去阅读使用部分. ps: 作者本着开源分享的精神撰写本篇文章,如果出现任何误差务必留言指正,作者会在第一时间内修正,共同维护一个好的开源生态,谢谢!!! 一.简介 作者所讲的context的包名称是: "golang.org/x/net/context" ,希望读者不要引用错误了. 在godoc中对context的介绍如下: Package contex

Golang Context 包详解

Golang Context 包详解 0. 引言 在 Go 语言编写的服务器程序中,服务器通常要为每个 HTTP 请求创建一个 goroutine 以并发地处理业务.同时,这个 goroutine 也可能会创建更多的 goroutine 来访问数据库或者 RPC 服务. 当这个请求超时或者被终止的时候,需要优雅地退出所有衍生的 goroutine,并释放资源.因此,我们需要一种机制来通知衍生 goroutine 请求已被取消. 比如以下例子,sleepRandom_1 的结束就无法通知到 sle

golang Context for goroutines

概要 goroutine 的控制 取消控制 超时控制 goroutine 之间的传值 总结 概要 golang 的提供的 channel 机制是基于 CSP(Communicating Sequencial Processes)模型的并发模式. 通过 channel, 可以很方便的写出多个 协程 (goroutine)之间协作的代码, 将顺序的代码改成并行的代码非常简单. 改造成并行的代码之后, 虽然可以更好的利用多核的硬件, 有效的提高代码的执行效率, 但是, 也带来了代码控制的问题. 并行的

grpc 入门(二)-- context

本节是继上一章节Hello world的进一步深入挖掘; 一.grpc 服务接口类型 在godoc的网站上对grpc的端口类型进行了简单的介绍,总共有下面4种类型[1]: gRPC lets you define four kinds of service method: Unary RPCs where the client sends a single request to the server and gets a single response back, just like a nor

go context学习

context学习 context的struct设计 type Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan struct{} Err() error Value(key interface{}) interface{} } struct中字段分析 Deadline()返回设置的截止时间和有无设置截止时间 Done()返回一个只读的chan,用来通知是否要释放资源 Err()返回取消的原因 V

Knative Serving 进阶: Knative Serving SDK 开发实践

作者 | 阿里云智能事业群技术专家 牛秋霖(冬岛) 导读:通过前面的一系列文章你已经知道如何基于 kubectl 来操作 Knative 的各种资源.但是如果想要在项目中集成 Knative 仅仅使用 kubectl 这种命令的方式是不够的,还需要在代码中基于 Knative Serving SDK 进行集成开发.本篇文章中,阿里云智能事业群技术专家冬岛将从 Knative Serving SDK 入手,介绍如何基于 Knative SDK 进行 serverless 开发. Golang Co

什么是架构

什么是软件架构 前言:软体设计师中有一些技术水平较高.经验较为丰富的人,他们需要承担软件系统的架构设计,也就是需要设计系统的元件如何划分.元件之间如何发生相互作用,以及系统中逻辑的.物理的.系统的重要决定的作出.在很多公司中,架构师不是一个专门的和正式的职务.通常在一个开发小组中,最有经验的程序员会负责一些架构方面的工作.在一个部门中,最有经验的项目经理会负责一些架构方面的工作.但是,越来越多的公司体认到架构工作的重要性. 什么是软件系统的架构(Architecture)?一般而言,架构有两个要

go get报错unrecognized import path “golang.org/x/net/context”…

今天安装gin框架,首先下载gin,命令如下:go get github.com/mattn/go-sqlite3 结果报错: package golang.org/x/net/context: unrecognized import path "golang.org/x/net/context" (https fetch: Get https://golang.org/x/net/context?go-get=1: dial tcp 216.239.37.1:443: connect

golang标准库 context的使用

本文索引 问题引入 context包简介 示例 问题引入 goroutine为我们提供了轻量级的并发实现,作为golang最大的亮点之一更是备受推崇. goroutine的简单固然有利于我们的开发,但简单总是有代价的,考虑如下例子: func httpDo(req *http.Request, resp *http.Response) { for { select { case <-time.After(5 * time.Second): // 从req读取数据然后发送给resp // 其他的一