Go_Context
https://www.liwenzhou.com/posts/Go/go_context/
1. 主goroutine如何通知子goroutine退出
1.1 使用全局变量
package main import (
"fmt"
"sync"
"time"
) var wg sync.WaitGroup
// 使用全局变量来通知子goroutine退出
// 主goroutine来设置notify的值
var notify bool func f() {
defer wg.Done()
for {
fmt.Println("==")
time.Sleep(time.Millisecond * 500)
if notify {
break
}
}
} func main() {
wg.Add(1)
go f()
time.Sleep(time.Second * 5)
// 如何通知子goroutine退出
notify = true
wg.Wait() }
1.2 使用channel
package main import (
"fmt"
"sync"
"time"
) var wg sync.WaitGroup
var exitChan = make(chan bool, 1) func f() {
defer wg.Done()
FORLOOP:
for {
fmt.Println("==")
time.Sleep(time.Millisecond * 500)
select {
case <-exitChan:
break FORLOOP
default:
}
}
} func main() { wg.Add(1)
go f()
time.Sleep(time.Second * 5)
// 如何通知子goroutine退出
exitChan <- true
wg.Wait()
}
1.3 使用context(为了协同开发,官方弄了这个context)
package main import (
"context"
"fmt"
"sync"
"time"
) var wg sync.WaitGroup func f2(ctx context.Context) {
defer wg.Done()
FORLOOP:
for {
fmt.Println("保德路")
time.Sleep(time.Millisecond * 500)
select {
case <-ctx.Done():
break FORLOOP
default:
}
}
} func f(ctx context.Context) {
defer wg.Done()
// f2私有f调的,context也是由f给的
// 在主goroutine调cancel()的时候都会传到f2,不管有多少级
go f2(ctx)
FORLOOP:
for {
fmt.Println("==")
time.Sleep(time.Millisecond * 500)
select {
case <-ctx.Done():
break FORLOOP
default:
}
}
} func main() {
ctx, cancel := context.WithCancel(context.Background())
wg.Add(1)
go f(ctx)
time.Sleep(time.Second * 5)
// 如何通知子goroutine退出
cancel() // 往ctx.Done()写一个空的结构体,拿到结构体就知道要退出了
wg.Wait()
}
Go_Context的更多相关文章
随机推荐
- python 的eval函数
python中的eval()函数是用来计算所有数学的代数计算式,这样可以很快得到复杂代数式的结果. 例如:383660347*375705824-1796136991-1726898699*18994 ...
- IntelliJ IDEA 2019年最新版2019.3.1 安装激活教程【最强,可用至2100、2089年】
IntelliJ IDEA 2019年最新版 永久激活教程 本文包括最新[2019.3.1 & 1.3]激活 和[2018.3.2]激活 说明:①2019.3.②2019.1.③2018.3版 ...
- Python面向对象三大特性(封装、继承、多态)
封装 类中把某些属性和方法隐藏起来,或者定义为私有,只在类的内部使用,在类的外部无法访问,或者留下少量的接口(函数)供外部访问:从上一篇文章中的私有属性与私有方法中的代码体现了该特性. class m ...
- Javascript的重要数据类型-对象
这次的分享,主要还是想跟大家聊聊Javascript语言中很重要的概念之一,对象.为什么说之一呢?因为Javascript其他重要概念还包括:作用域 作用域链 继承 闭包 函数 继承 数组 ..... ...
- 查看Sql Server库中某张表的结构
--快速查看表结构(比较全面的) SELECT CASE WHEN col.colorder = THEN obj.name ELSE '' END AS 表名, col.colorder AS 序号 ...
- Vue中封装axios
参考: https://www.jianshu.com/p/7a9fbcbb1114 https://www.cnblogs.com/dreamcc/p/10752604.html 一.安装axios ...
- Linux下搭建PHP环境的参考文章小记
之前也在Linux上安装过两次,但是当我再次需要安装时,还是很多不懂的地方,于是记下此篇,以防下次再费经心思找到不合适的文章,瞎折腾. 通过参考这几篇文章,成功的安装好了自己的PHP(LNMP)环境. ...
- (转)预估大数据量下UV的方法
在实际应用中,我们经常碰到这种情况,即要统计某个对象或者事件独立出现的次数.对于较小的数据量,这很容易解决,我们可以首先在内存中对序列进行排序,然后扫描有序序列统计独立元素数目.其中排序时间复杂度为O ...
- JS全选按钮练习
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- SpringCloud Netflix Zuul
网关的概念 服务A.B都是暴露出来,供外部直接调用的, 有时候需要对请求进行过滤.校验,比如检验用户是否已登陆,可以写在暴露出来的每个服务中,但要在多个服务中写相同的代码,太繁琐,可以提出来,放在网关 ...