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的更多相关文章
随机推荐
- 为什么MYSQL分页时使用limit+ order by会出现数据重复问题
问题描述: MYSQL采用limit进行翻页查询时,搭配order by ,在翻到第二页的时候可能会出现第一页的数据, 示例sql如下: select a,b from c where d = ' ...
- Docker最全教程——从理论到实战(二十一)
前言 MySQL是目前最流行的开源的关系型数据库,MySQL的容器化之前有朋友投稿并且写过此块,本篇仅从笔者角度进行总结和编写. 目录 镜像说明 运行MySQL容器镜像 1.运行MySQL容器 ...
- react-绑定this并传参的三种方式
绑定this并传参的三种方式 在事件中绑定this并传参: <input type="button" value="在事件中绑定this并传参" onCl ...
- VMware安装CentOS系统与配置全过程
1.需要哪些安装包 VMware Workstation 15 Pro CentOS-7-x86_64-DVD-1810 hadoop-2.7.3 apache-hive-3.1.1 jdk-8u18 ...
- MyBatis 中 Mapper 接口的使用原理
MyBatis 中 Mapper 接口的使用原理 MyBatis 3 推荐使用 Mapper 接口的方式来执行 xml 配置中的 SQL,用起来很方便,也很灵活.在方便之余,想了解一下这是如何实现的, ...
- 关闭visual studio code 智能提示功能
对于程序初学者来说,应该少用IDE的提示功能,因为这样有助于记住一些常用的函数等功能.这也是为什么戏称喜欢用notepad++(windows)或者vim编辑器(Linux)来开发代码是大神的原因,而 ...
- eclipse中配置maven环境
一.配置setting.xml文件 1.首先将下载好的maven打开,打开文件夹,首先就需要对maven安装目录下有个config文件夹,在文件夹下有settings.xml文件.settings里面 ...
- 关于向sql中插入datetime部分问题总结
非int型数据要加单引号, 用format格式化当前时间后用String插入即可 读取时用时间戳读取datetime或转化为string存储 读 public static String gainTi ...
- MFC使用LoadBitmap方法加载位图文件失败解决方案(转)
用如下方法在原项目中使用LoadBitmap方法加载已有的位图资源作为背景没有问题,但放在别的项目中总是加载不出来,该函数返回NULL HBITMAP hBitmap=LoadBitmap((HINS ...
- python特性
# for用法 for i in range(0,100,2): print(i) n = 0 # while用法 while n < 100: print(n) n += 2 else: pr ...