简言

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的使用相关推荐

  1. 此上下文中不允许函数定义。_深度好文 | 你知道Go中的 context 是怎么实现的吗?...

    Go语言中文网,致力于每日分享编码知识,欢迎关注我,会有意想不到的收获! Go 语言的 context 包短小精悍,非常适合新手学习.不论是它的源码还是实际使用,都值得投入时间去学习. 这篇文章依然想 ...

  2. golang context 父子任务同步取消信号 协程调度 简介

    目录 前言 为什么需要context context是什么 context的使用 总结 前言 这篇文章将介绍Golang并发编程中常用到一种编程模式:context.本文将从为什么需要context出 ...

  3. 并发安全Context包的使用

    前言–为什么需要Context Golang context是Golang应用开发常用的并发控制技术,它与WaitGroup最大的不同点是context对于派生goroutine有更强的控制力,它可以 ...

  4. 深度解密Go语言之context

    文章目录 什么是 context 为什么有 context context 底层实现原理 整体概览 接口 Context canceler 结构体 emptyCtx cancelCtx timerCt ...

  5. go context的使用总结

    简言 go语言提供了控制子协程的方法,除了waitgroup之外还可以利用context 步骤如下 1. 新建一个子协程的时候,在子协程的函数参数中传入context 2. 子协程循环读取传入的con ...

  6. 深入理解Golang之context

    深入理解Golang之context context是Go并发编程中常用到一种编程模式.本文将从为什么需要context,深入了解context的实现原理,以了解如何使用context. 作者:Tur ...

  7. 源码分析 | 深度解密Go语言之context

    之前写的文章 Context是怎么在Go语言中发挥关键作用的 以图解的方式给大家讲解了 Context的实现原理以及它为什么能便捷地对多层并发任务进行控制,写作期间阅读了不少作者的源码解析文章,桃花源 ...

  8. golang:context介绍

    我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战 1 前言 最近实现系统的分布式日志与事务管理时,在寻求所谓的全局唯一Goroutine ID无果之后,决定还是简单利用Conte ...

  9. 深入解析Golang之Context

    ​context是什么 context翻译成中文就是上下文,在软件开发环境中,是指接口之间或函数调用之间,除了传递业务参数之外的额外信息,像在微服务环境中,传递追踪信息traceID, 请求接收和返回 ...

最新文章

  1. php中isdefin,在PHP中定義全局常量數組的最“優雅”方法是什么
  2. 在jenkins上配置 sonar 两种方式的区别
  3. Uncaught TypeError: object is not a function
  4. 数码相机控制点的自动定位检校
  5. 了解下广告计费模式CPC、CPA和CPM
  6. 作为相亲大户,程序猿为何普遍单身?
  7. God of War Ascension / 战神4, 再一次迎来新导演!
  8. 在OpenStack虚拟机实例中创建swap分区的一种方法
  9. 远程连接到 SQL Server 2005 时的问题汇集!!
  10. java获取不重复随机数_java实现生成不重复的随机数,可循环利用
  11. AVOD-代码阅读理解系列(一)
  12. 最最简单的使用DW编程软件
  13. Python多继承及MRO顺序
  14. multi_match 查询【muti_match和match区别】
  15. vb 读取mysql所有表名_VB 读取ACCESS数据库中所有表名和指定表字段名.doc
  16. 解决XAMPP中无法勾选/无服务/modules无反应/Service灰框/无✓X/提供虚拟服务器
  17. SSO单点登录-基于cookie的单点登录
  18. Android异常大全
  19. openstack云平台搭建与使用
  20. 数学基础:斜率、正切与 math.tan()

热门文章

  1. 从PHP5.2.x迁移到PHP5.3.x
  2. 关于ssl免费证书设置
  3. 为DedeCms的RSS生成绝对地址
  4. CodeForces - 487B Strip(线段树+dp+二分)
  5. POJ - 3565 Ants(二分图最小权匹配+KM+思维)
  6. Rust学习资料大全
  7. 感染性的木马病毒分析之样本KWSUpreport.exe
  8. C++匿名对象调用成员函数
  9. masm中常用的伪指令
  10. QUIC/HTTP2相关资料整理