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的更多相关文章
随机推荐
- Npoi常用操作方法介绍
1.ShiftRows(startRow,endRow,moveRows) 将开始行到结束行向上或者向下移动moveRows行,moveRows为正数向下移动,为负数向上移动(向上移动,会把之前的行覆 ...
- laravel上传git如何忽略你不想提交的文件
1.在文件根目录下面有一个文件 .gitignore .gitignore文件用来忽略被指定的文件或文件夹的改动,被记录在.gitignore文件里的文件或文件夹,是无法被git跟踪到的,换句话说,被 ...
- c# 调用c++类库控制usb继电器
网上找不到调用此类库的文章,简单写一下,以备后用. 下面是封装后的调用c++类库的类 public class UsbRelayDeviceHelper { /// <summary> / ...
- Ubuntu系统测评
首次使用ubuntun系统 华为云可以免费试用30天,嘻嘻,正好熟悉一下linux命令 1.登录 login: 先输入用户名:root 在输入密码:******** 这个是在配置云服务器的时候自己设置 ...
- pytorch深度学习书、论坛和比赛地址
pytorch深度学习书.论坛和比赛地址 待办 https://zhuanlan.zhihu.com/p/85353963 http://zh.d2l.ai/ https://discuss.gluo ...
- 1080 Graduate Admission
大致题意就是有N个学生,有M个学校,每个学校的名额都是正整数.每个学生可以填K个学校志愿,N个学生一起排名以后,排名高的学生先挑学校,不保护一志愿. 题目要求: 首先,把所有学生按总成绩SUM(GE+ ...
- centos7搭建zabbix
参考:https://blog.csdn.net/xiaocong66666/article/details/82818893 安装所需的依赖包即可: yum install gcc gcc-c++ ...
- path('<int:question_id>/vote/', views.vote, name='vote')中的<int:question_id>的含义
path('<int:question_id>/vote/', views.vote, name='vote')<int:question_id>用于匹配URL的值,并将扑捉到 ...
- 159.SQL注入的实现和防御措施
sql注入: 所谓sql注入,就是通过把sql命令插入到表单中或页面请求的查询字符串中,最终达到欺骗服务器执行恶意的sql命令.具体来说,它是利用现有的应用程序,将(恶意的)sql命令注入到后台数据库 ...
- 小匠第一周期打卡笔记-Task02
一.文本预处理 预处理通常包括四个步骤: 读入文本 分词 建立字典,将每个词映射到一个唯一的索引(index) 将文本从词的序列转换为索引的序列,方便输入模型 读入文本: import collect ...