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的更多相关文章

随机推荐

  1. Laravel框架中通过EasyWeChat发送公众号模板消息

    环境要求 PHP >= 7.0 PHP cURL 扩展 PHP OpenSSL 扩展 PHP SimpleXML 扩展 PHP fileinfo 拓展 使用composer安装: $ compo ...

  2. springMVC请求访问的整个过程

    //以上个随笔(springMVC项目配置文件)为基础,详述springMVC请求的整个过程流向 web.xml                                            ...

  3. 简单记账本APP开发二

    今天主要是进行了适配器的编写,数据库的创建以及对完善了业务逻辑,简单的APP到此已经通过测试可以使用.

  4. oracle Insert 一次插入多条记录

    oracle Insert 一次插入多条记录有两种方法: 1)Insert All Into table_name values ... insert all into table_name valu ...

  5. BDA3 Chapter 1 Probability and inference

    1. uncertainty aleatoric uncertainty 偶然不确定性 epistemic uncertainty 认知不确定性 2. probability VS likelihoo ...

  6. 二叉堆(2)LeftistHeap

    左倾堆,用于堆的快速合并. 规则: ① 节点的键值小于或等于它的左右子节点的键值. ② 节点的左孩子的NPL >= 右孩子的NPL. ③ 节点的NPL = 它的右孩子的NPL + 1. 测试文件 ...

  7. C++&C语言 -> //有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

    /*    a                  b                          c       d 1  5                   5               ...

  8. C 库函数 - fmod()

    C 库函数 - fmod() 转自: C 标准库 - <math.h> 描述 C 库函数 double fmod(double x, double y) 返回 x 除以 y 的余数. 声明 ...

  9. Invalid Native Object

    发现是因为没有addChild到父节点上引起的

  10. Redis 数据总结 (2.命令实现逻辑)

    1.通过合理的Redis数据分布,实现逻辑的简化,即将部分逻辑纳入redis 连个sort表的合并,相关的资料见 http://www.redis.net.cn/order/3613.html ZIN ...