go context之WithCancel的使用
简言
1. WithCancel()函数接受一个 Context 并返回其子Context和取消函数cancel
2. 新创建协程中传入子Context做参数,且需监控子Context的Done通道,若收到消息,则退出
3. 需要新协程结束时,在外面调用 cancel 函数,即会往子Context的Done通道发送消息
4. 注意:当 父Context的 Done() 关闭的时候,子 ctx 的 Done() 也会被关闭
实验步骤
1. 利用根Context创建一个父Context,使用父Context创建一个协程,
2. 利用上面的父Context再创建一个子Context,使用该子Context创建一个协程
3. 一段时间后,调用父Context的cancel函数,会发现父Context的协程和子Context的协程都收到了信号,被结束了
实验结果如下图
代码如下
package mainimport ("context""fmt""time"
)func main() {// 父context(利用根context得到)ctx, cancel := context.WithCancel(context.Background())// 父context的子协程go watch1(ctx)// 子context,注意:这里虽然也返回了cancel的函数对象,但是未使用valueCtx, _ := context.WithCancel(ctx)// 子context的子协程go watch2(valueCtx)fmt.Println("现在开始等待3秒,time=", time.Now().Unix())time.Sleep(3 * time.Second)// 调用cancel()fmt.Println("等待3秒结束,调用cancel()函数")cancel()// 再等待5秒看输出,可以发现父context的子协程和子context的子协程都会被结束掉time.Sleep(5 * time.Second)fmt.Println("最终结束,time=", time.Now().Unix())
}// 父context的协程
func watch1(ctx context.Context) {for {select {case <-ctx.Done(): //取出值即说明是结束信号fmt.Println("收到信号,父context的协程退出,time=", time.Now().Unix())returndefault:fmt.Println("父context的协程监控中,time=", time.Now().Unix())time.Sleep(1 * time.Second)}}
}// 子context的协程
func watch2(ctx context.Context) {for {select {case <-ctx.Done(): //取出值即说明是结束信号fmt.Println("收到信号,子context的协程退出,time=", time.Now().Unix())returndefault:fmt.Println("子context的协程监控中,time=", time.Now().Unix())time.Sleep(1 * time.Second)}}
}
go context之WithCancel的使用相关推荐
- 此上下文中不允许函数定义。_深度好文 | 你知道Go中的 context 是怎么实现的吗?...
Go语言中文网,致力于每日分享编码知识,欢迎关注我,会有意想不到的收获! Go 语言的 context 包短小精悍,非常适合新手学习.不论是它的源码还是实际使用,都值得投入时间去学习. 这篇文章依然想 ...
- golang context 父子任务同步取消信号 协程调度 简介
目录 前言 为什么需要context context是什么 context的使用 总结 前言 这篇文章将介绍Golang并发编程中常用到一种编程模式:context.本文将从为什么需要context出 ...
- 并发安全Context包的使用
前言–为什么需要Context Golang context是Golang应用开发常用的并发控制技术,它与WaitGroup最大的不同点是context对于派生goroutine有更强的控制力,它可以 ...
- 深度解密Go语言之context
文章目录 什么是 context 为什么有 context context 底层实现原理 整体概览 接口 Context canceler 结构体 emptyCtx cancelCtx timerCt ...
- go context的使用总结
简言 go语言提供了控制子协程的方法,除了waitgroup之外还可以利用context 步骤如下 1. 新建一个子协程的时候,在子协程的函数参数中传入context 2. 子协程循环读取传入的con ...
- 深入理解Golang之context
深入理解Golang之context context是Go并发编程中常用到一种编程模式.本文将从为什么需要context,深入了解context的实现原理,以了解如何使用context. 作者:Tur ...
- 源码分析 | 深度解密Go语言之context
之前写的文章 Context是怎么在Go语言中发挥关键作用的 以图解的方式给大家讲解了 Context的实现原理以及它为什么能便捷地对多层并发任务进行控制,写作期间阅读了不少作者的源码解析文章,桃花源 ...
- golang:context介绍
我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战 1 前言 最近实现系统的分布式日志与事务管理时,在寻求所谓的全局唯一Goroutine ID无果之后,决定还是简单利用Conte ...
- 深入解析Golang之Context
context是什么 context翻译成中文就是上下文,在软件开发环境中,是指接口之间或函数调用之间,除了传递业务参数之外的额外信息,像在微服务环境中,传递追踪信息traceID, 请求接收和返回 ...
最新文章
- php中isdefin,在PHP中定義全局常量數組的最“優雅”方法是什么
- 在jenkins上配置 sonar 两种方式的区别
- Uncaught TypeError: object is not a function
- 数码相机控制点的自动定位检校
- 了解下广告计费模式CPC、CPA和CPM
- 作为相亲大户,程序猿为何普遍单身?
- God of War Ascension / 战神4, 再一次迎来新导演!
- 在OpenStack虚拟机实例中创建swap分区的一种方法
- 远程连接到 SQL Server 2005 时的问题汇集!!
- java获取不重复随机数_java实现生成不重复的随机数,可循环利用
- AVOD-代码阅读理解系列(一)
- 最最简单的使用DW编程软件
- Python多继承及MRO顺序
- multi_match 查询【muti_match和match区别】
- vb 读取mysql所有表名_VB 读取ACCESS数据库中所有表名和指定表字段名.doc
- 解决XAMPP中无法勾选/无服务/modules无反应/Service灰框/无✓X/提供虚拟服务器
- SSO单点登录-基于cookie的单点登录
- Android异常大全
- openstack云平台搭建与使用
- 数学基础:斜率、正切与 math.tan()