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的更多相关文章
随机推荐
- 关于f(x)
有时 z = x + y 有时 0 = x + y 有时单独用f(x) 有时 z = f(x) 很容易分不清. 从集合角度,将f(x)看成映射 即从A集合到B集合的对应关系 这样f(x)可以单独使用, ...
- sqlmap注入基本教程
附上一个别人总结的:https://www.cnblogs.com/ichunqiu/p/5805108.html 一套基础的sqlmap语句: python sqlmap.py -u "h ...
- Disharmony Trees HDU - 3015 树状数组+离散化
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using ...
- 敌兵布阵 HDU - 1166 板子题
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...
- Cloud插件,链接oracle数据库
业务场景:客户需要在Cloud中获取第三方系统的数据,但是第三方系统的数据库是oracle,这是就需要连接oracle数据库获取数据了. 需要引用Oracle.ManagedDataAccess.dl ...
- 程序里面带有浮点数,默认会自动转换为double类型存储
带有浮点数,默认会转换为double类型存储. #include "common.h" #include <stdio.h> #include <stdlib.h ...
- 野路子码农系列(8)我终于大致搞懂了GBDT
由于下下周要在组里介绍一个算法,最近开始提前准备,当初非常自信地写下自己最喜欢的GBDT,但随着逐步深入,发现其实自己对这个算法的细节并不是非常了解,了解的只是一些面试题的答案而已……(既然没有深入了 ...
- C++ -> 在使用动态链表和异质链表产生野指针的步骤
C++ -> 在使用动态链表和异质链表产生野指针的步骤 使用异质链表产生野指针的情况,下面是修改书本的例子: ------------------------------------------ ...
- 关于Django图片上传
首先要设置settings # 上传文件 MEDIA_ROOT = 'media' # 项目下的目录 MEDIA_URL = "/media/" # 跟STATIC_URL类似,指 ...
- 【Python】圆周率的计算
1.公式法 代码: #CalPiV1.py pi=0 N=100 for k in range(N): pi+=1/pow(16,k)*(\ 4/(8*k+1)-2/(8*k+4)-\ 1/(8*k ...