golang中context包学习

  • 摘要

go语言中goroutine之间的关联关系,缺乏维护,在erlang中有专门的机制来保障新开仟程的生命周期,

在go语言中,只能通过channel + select来实现,但不够直观,感觉很绕。

Context 通常被译作 上下文 ,它是一个比较抽象的概念。在公司技术讨论时也经常会提到 上下文 。一般理解为程序单元的一个运行状态、现场、快照,而翻译中 上下 又很好地诠释了其本质,上下上下则是存在上下层的传递,  会把内容传递给  。在Go语言中,程序单元也就指的是Goroutine。

context 包不仅实现了在程序单元之间共享状态变量的方法,同时能通过简单的方法,使我们在被调用程序单元的外部,通过设置ctx变量值,将过期或撤销这些信号传递给被调用的程序单元。

  • 源码剖析

context包的接口

//  context 包里的方法是线程安全的,可以被多个 goroutine 使用
type Context interface {
    // 当Context 被 canceled 或是 times out 的时候,Done 返回一个被 closed 的channel
    Done() <-chan struct{}       

    // 在 Done 的 channel被closed 后, Err 代表被关闭的原因
    Err() error

    // 如果存在,Deadline 返回Context将要关闭的时间
    Deadline() (deadline time.Time, ok bool)

    // 如果存在,Value 返回与 key 相关了的值,不存在返回 nil
    Value(key interface{}) interface{}
}

我们不需要手动实现这个接口,context 包已经给我们提供了两个,一个是 Background(),一个是 TODO(),这两个函数都会返回一个 Context 的实例。只是返回的这两个实例都是空 Context。

  

时间: 2024-10-29 12:10:58

golang中context包学习的相关文章

golang 中io包用法(一)

本文转自Golove博客:http://www.cnblogs.com/golove/p/3276678.html io 包为I/O原语提供了基础的接口.它主要包装了这些原语的已有实现,如 os 包中的那些,抽象成函数性的共享公共接口,加上一些其它相关的原语. 由于这些接口和原语以不同的实现包装了低级操作,因此除非另行通知,否则客户不应假定它们对于并行执行是安全的. 在io包中最重要的是两个接口:Reader和Writer接口,首先来介绍这两个接口. type Reader interface

golang 之 context包

概述     context是Go中广泛使用的程序包,由Google官方开发,在1.7版本引入.它用来简化在多个go routine传递上下文数据.(手动/超时)中止routine树等操作,比如,官方http包使用context传递请求的上下文数据,gRpc使用context来终止某个请求产生的routine树.每个Context应该视为只读的,通过WithCancel.WithDeadline.WithTimeout和WithValue函数可以基于现有的一个Context(称为父Context

golang——net/rpc包学习

1.rpc包 rpc包提供了通过网络或其他I/O连接对一个对象的导出方法的访问. 只有满足如下标准的方法才能用于远程访问,其余方法会被忽略: (1)方法是导出的(2)方法有两个参数,都是导出类型或内建类型(3)方法的第二个参数是指针(4)方法只有一个error接口类型的返回值 func (t *T) MethodName(argType T1, replyType *T2) error 其中T.T1和T2都能被encoding/gob包序列化. 方法的第一个参数代表调用者提供的参数:第二个参数代

golang中time包的使用

一.代码 package main; import ( "time" "fmt" ) func main() { //time.Time代表一个纳秒精度的时间点 var t time.Time; //返回当前时间 t = time.Now(); fmt.Printf("%v\n", t); //反回所在时区 fmt.Printf("%v\n", t.Location()); //返回UTC时间和UTC时区 fmt.Printf

[Go] golang中的包管理

在配置了环境变量$GOPATH后,比如下面这个路径 export GOPATH=/mnt/f/ubuntu/goProject 在这个路径下面会有这几个目录 在src目录下放着我的源码比如: 在同一个目录下,比如websocket,不需要import,就可以互相调用其它文件的函数,但是在go run的时候要把那几个用到的文件都加上 如果在websocket目录下定义了其他包,就要新建目录,里面的go文件定义 packge 目录名 比如main.go my.go server包下的websocke

Android中的context的学习理解

Android中Context的学习理解Context是一个抽象基类,通过它getResuources.getAssets and start 其他组件(Activity,Service,broadCast,getSystemService),可以这样理解:Context提供了一个运行环境for App, then app 可以访问资源,才能完成与其他组件,服务的交互,Context定义了一套基本的功能接口or一套规范 //todo

golang中解决tcp传输中的粘包问题

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> golang中解决tcp传输中的粘包问题 - Programmer小卫 - 博客频道 - CSDN.NET Programmer小卫 故不积跬步,无以至千里.不积小流,无以成江海. 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书

Golang Context 包详解

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

golang中的rpc包用法

RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. 我所在公司的项目是采用基于Restful的微服务架构,随着微服务之间的沟通越来越频繁,就希望可以做成用rpc来做内部的通讯,对外依然用Restful.于是就想到了golang标准库的rpc包和google的grpc. 这篇文章重点了解一下golang的rpc包. 介绍 golang的rpc支持三个级别的RPC:TCP.HTTP.JSONRPC.但Go的RPC包