1、WaitGroup

它是一种控制并发的方式,它的这种方式是控制多个goroutine同时完成。

func main() {var wg sync.WaitGroupwg.Add(2)go func() {time.Sleep(2*time.Second)fmt.Println("1号完成")wg.Done()}()go func() {time.Sleep(2*time.Second)fmt.Println("2号完成")wg.Done()}()wg.Wait()fmt.Println("好了,大家都干完了,放工")
}

一个很简单的例子,一定要例子中的2个goroutine同时做完,才算是完成,先做好的就要等着其他未完成的,所有的goroutine要都全部完成才可以。

2、chan通知

我们都知道一个goroutine启动后,我们是无法控制他的,大部分情况是等待它自己结束,那么如果这个goroutine是一个不会自己结束的后台goroutine呢?比如监控等,会一直运行的。

这种情况化,一直傻瓜式的办法是全局变量,其他地方通过修改这个变量完成结束通知,然后后台goroutine不停的检查这个变量,如果发现被通知关闭了,就自我结束。

这种方式也可以,但是首先我们要保证这个变量在多线程下的安全,基于此,有一种更好的方式:chan + select 。

func main() {stop := make(chan bool)go func() {for {select {case <-stop:fmt.Println("监控退出,停止了...")returndefault:fmt.Println("goroutine监控中...")time.Sleep(2 * time.Second)}}}()time.Sleep(10 * time.Second)fmt.Println("可以了,通知监控停止")stop<- true//为了检测监控过是否停止,如果没有监控输出,就表示停止了time.Sleep(5 * time.Second)
}

3、WithTimeout 超时自动取消方法

当执行一个go 协程时,超时自动取消协程

// 模拟一个最小执行时间的阻塞函数
func inc(a int) int {res := a + 1                // 虽然我只做了一次简单的 +1 的运算,time.Sleep(1 * time.Second) // 但是由于我的机器指令集中没有这条指令,// 所以在我执行了 1000000000 条机器指令, 续了 1s 之后, 我才终于得到结果。B)return res
}// 向外部提供的阻塞接口
// 计算 a + b, 注意 a, b 均不能为负
// 如果计算被中断, 则返回 -1
func Add(ctx context.Context, a, b int) int {res := 0for i := 0; i < a; i++ {res = inc(res)select {case <-ctx.Done():return -1default:}}for i := 0; i < b; i++ {res = inc(res)select {case <-ctx.Done():return -1default:}}return res
}

计算 a+b

func main() {// 使用开放的 API 计算 a+ba := 1b := 2timeout := 2 * time.Secondctx, _ := context.WithTimeout(context.Background(), timeout)res := Add(ctx, 1, 2)fmt.Printf("Compute: %d+%d, result: %d\n", a, b, res)
}

输出结果:Compute: 1+2, result: -1

4、WithCancel 手动取消方法

func main() {// 手动取消a := 1b := 2ctx, cancel := context.WithCancel(context.Background())go func() {time.Sleep(2 * time.Second)cancel() // 在调用处主动取消}()res := Add(ctx, 1, 2)fmt.Printf("Compute: %d+%d, result: %d\n", a, b, res)
}

输出结果:Compute: 1+2, result: -1

原文链接:https://www.cnblogs.com/netuml/p/9063239.html

go context包的WithTimeout和WithCancel的使用相关推荐

  1. Golang Context包的使用

    context包主要用来控制goroutings间的并发控制.使用场景包括通知子协程退出这种. 相关接口和示例: func Background() Context Background return ...

  2. 并发安全Context包的使用

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

  3. Go语言的context包从放弃到入门

    转载地址:https://www.cnblogs.com/chenqionghe/p/14107790.html 一.Context包到底是干嘛用的 我们会在用到很多东西的时候都看到context的影 ...

  4. 深入理解Golang中的Context包

    context.Context是Go语言中独特的设计,在其他编程语言中我们很少见到类似的概念.context.Context深度支持Golang的高并发. 1. Goroutine和Channel 在 ...

  5. 一文搞懂Go标准库context包

    "Gopher部落"星球双11现金优惠,点击链接领劵 https://t.zsxq.com/078E1QTjM  立减88元. 自从context包在Go 1.7版本[1]加入Go ...

  6. golang context包

    一.介绍 go中有Context 包,专门用来简化 对于处理单个请求的多个 goroutine 之间与请求域的数据.取消信号.截止时间等相关操作,这些操作可能涉及多个 API 调用.你可以通过 go ...

  7. golang - context包使用示例 以及 底层实现

    文章目录 1. context 常用方法,以及各种适用于什么场景 1.1 context含有的方法 1.2 方法适用场景和伪代码示例 1.2.1 值传递:比如gin框架中用来传递key,value的值 ...

  8. gorrilla Context包深入学习

    导语 做过web开发的同学肯定都知道,我们经常使用 r *http.Request 这个变量来获取我们希望获得的参数,但是我们经常遇到这样一个场景,我们需要为我们的r设置更多的key-value形式的 ...

  9. go context之WithTimeout的使用

    简言 1. context包的WithTimeout()函数接受一个 Context 和超时时间作为参数,返回其子Context和取消函数cancel 2. 新创建协程中传入子Context做参数,且 ...

最新文章

  1. websocket心跳链接代码_WebSocket原理与实践(五)--心跳及重连机制
  2. 全能音乐助手序列号_颜控最爱的全能本 惠普星14全能轻薄本深度解析
  3. 【PAT乙级】1041 考试座位号 (15 分)
  4. (转)NSString to string(支持中文)
  5. oracle where in优化,【求助】为什么在where过滤条件中使用in这样子查询后速度变的非常慢?!...
  6. display:inline-block的深入理解 转
  7. leetcode39. 组合总和
  8. 科目三电子路考哪些情况会被评判不合格
  9. win下anaconda装python2.7和3.5以及jupyter共存 (本篇实践通过)
  10. Extensible Firmware Interface
  11. 2场直播丨OGG日常运维及故障处理、云原生数据仓库AnalyticDB
  12. java 捕获运行时异常_java-如何通过ASM在字节码中捕获运行时异常
  13. delegate、notification、KVO各优缺点
  14. 任务二十九:表单(一)单个表单项的检验
  15. 画出典型计算机控制系统的方框图,计算机控制系统作业参考答案
  16. 创建服务器定时运行程序
  17. ng-alain php,angular基于ng-alain定义自己的select组件示例
  18. Vue项目实战——实现一个任务清单【基于 Vue3.x 全家桶(简易版)】
  19. 0926物体检测和数据集
  20. mjpeg-streamer移植

热门文章

  1. 十大python开发软件-2017年最棒的七个Python图形应用GUI开发框架
  2. python为什么中文要encoding-python中encoding是什么意思
  3. python基础知识资料-python基础知识整理(值得收藏)
  4. python中文件读写位置的作用-Python中文件的读写
  5. 大学python和vb哪个简单-vb和python哪个速度快
  6. python代码大全o-Python简单I/O操作示例
  7. python中文读音ndarray-Python中Numpy ndarray的使用详解
  8. python编写程序-30分钟学会用Python编写简单程序
  9. LeetCode Find Minimum in Rotated Sorted Array II
  10. UVa12412 - A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)