context.WithCancel
返回两个有关联的对象,ctx与cancel,调用cancel发送一个空struct给ctx,ctx一旦接收到该对象后,就终止goroutine的执行;
ctx是线程安全的,可以同时传递给多个goroutine,触发cancel时,取消所有goroutine的执行
package main

import (
"context"
"fmt"
"time"
) func testContext(){
ctx,cancel := context.WithCancel(context.Background())
go d1(ctx)
go d2(ctx) time.Sleep(7*time.Second)
cancel()
} func d1(ctx context.Context){
i:=0
for {
time.Sleep(1*time.Second)
i++
select {
case <- ctx.Done():
fmt.Println("d1 over")
return default:
fmt.Println("d1 ",i)
}
}
} func d2(ctx context.Context){ fmt.Println("d2 start")
<- ctx.Done()
fmt.Println("d2 over")
} func main(){
testContext()
fmt.Println("main over")
}

输出

d2 start
d1 1
d1 2
d1 3
d1 4
d1 5
d1 6
main over
context适用于这样的情况,你需要持续处理请求,有多个case分支,case分支中持续处理着数据,
select 之前的代码不会被终止,下面的这种写法,会终止return之后的代码、以及其他case分支的代码
case <- ctx.Done():
fmt.Println("d1 over")
return

使用场景举例
package main

import (
"context"
"fmt"
"time"
) func d1(i *int) chan int{
var cc = make(chan int)
go func() {
for {
time.Sleep(1*time.Second)
*i = *i + 1
cc <- *i
}
}()
return cc
} func textContext(cc chan int,ctx context.Context) {
for {
select {
case <- ctx.Done():
fmt.Println("context done ")
return
case n:= <- cc :
fmt.Println(n)
}
}
fmt.Println("wg done")
} func main() {
ctx,cancel := context.WithCancel(context.Background()) i:= 0
var cc = d1(&i) go textContext(cc,ctx) for {
time.Sleep(1*time.Second)
if i > 10 {
cancel()
break
}
}
}


context.WithTimeout

package main

import (
"fmt"
"context"
"time"
) func d1(ctx context.Context){
i := 0
for{
time.Sleep(1*time.Second)
select{
case <- ctx.Done():
fmt.Println("d1 over")
return
default:
fmt.Println("d1:",i)
}
}
} func test(){
ctx,cancel := context.WithTimeout(context.Background(),5*time.Second)
go d1(ctx)
fmt.Println("begin sleep 10 sec")
time.Sleep(10*time.Second)
fmt.Println("10 sec over")
cancel()
} func main(){
test()
}
[root@phoenix go]# go run cc.go
begin sleep 10 sec
d1: 0
d1: 0
d1: 0
d1: 0
d1 over
10 sec over

  

无法中止正在执行中case分支

package main

import (
"context"
"fmt"
"time"
) func main() {
ctx,cancel:= context.WithTimeout(context.Background(),5*time.Second)
go timeOut(ctx) time.Sleep(10*time.Second)
fmt.Println("强制唤醒")
cancel()
time.Sleep(5*time.Second)
fmt.Println("主程序结束")
} func timeOut(ctx context.Context) { for{
select {
case <- ctx.Done():
fmt.Println("context done") default:
fmt.Println("沉睡100秒")
time.Sleep(100*time.Second) }
}
}

沉睡100秒这个case分支一旦开始执行,除非main协程结束,否则context是无法中止其执行的;5秒超时context发送了结束信号,但select有case未执行完,其channel处于阻塞状态,所以无法中止程序

沉睡100秒
强制唤醒
主程序结束

golang context包  WithValue

3.1 go context代码示例的更多相关文章

  1. 微信消息接收 验证URL有效性 C#代码示例

    官方文档只给出了PHP的示例代码 开发者提交信息后,微信服务器将发送GET请求到填写的URL上,GET请求携带四个参数: 参数 描述 signature 微信加密签名,signature结合了开发者填 ...

  2. ffmpeg音频播放代码示例-avcodec_decode_audio4

    一.概述 最近在学习ffmpeg解码的内容,参考了官方的教程http://dranger.com/ffmpeg/tutorial03.html,结果发现这个音频解码的教程有点问题.参考了各种博客,并同 ...

  3. 中文代码示例之NW.js桌面应用开发初体验

    先看到了NW.js(应该是前身node-webkit的缩写? 觉得该起个更讲究的名字, 如果是NorthWest之意的话, logo(见下)里的指南针好像也没指着西北啊)和Electron的比较文章: ...

  4. Ice简介+Qt代码示例

    1.ICE是什么? ICE是ZEROC的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面向对象的中间件,它封装并 ...

  5. php发送get、post请求的6种方法代码示例

    本文主要展示了php发送get.post请求的6种方法的代码示例,分别为使用file_get_contents .fopen.fsockopen.curl来发送GET和POST请求,代码如下: 方法1 ...

  6. MapReduce序列化及分区的java代码示例

    概述 序列化(Serialization)是指把结构化对象转化为字节流. 反序列化(Deserialization)是序列化的逆过程.把字节流转为结构化对象. 当要在进程间传递对象或持久化对象的时候, ...

  7. MapReduce框架结构及代码示例

    一个完整的 mapreduce 程序在分布式运行时有三类实例进程: 1.MRAppMaster:负责整个程序的过程调度及状态协调 2.MapTask:负责 map 阶段的整个数据处理流程 3.Redu ...

  8. Spring 注解学习 详细代码示例

    学习Sping注解,编写示例,最终整理成文章.如有错误,请指出. 该文章主要是针对新手的简单使用示例,讲述如何使用该注释,没有过多的原理解析. 已整理的注解请看右侧目录.写的示例代码也会在结尾附出. ...

  9. 高级渲染技巧和代码示例 GPU Pro 7

    下载代码示例 移动设备正呈现着像素越来越高,屏幕尺寸越来越小的发展趋势. 由于像素着色的能耗非常大,因此 DPI 的增加以及移动设备固有的功耗受限环境为降低像素着色成本带来了巨大的压力. MSAA 有 ...

随机推荐

  1. 『学了就忘』Linux基础命令 — 34、配置网络相关命令

    目录 1.配置网络常用命令 2.ifconfig命令 3.ping命令 4.netstat 命令 使用1:查看本机开启的端口 使用2:查看本机有哪些程序开启的端口 使用3:查看所有连接 使用4:查看网 ...

  2. coding game, 边打游戏边学编程,是一种怎么样的体验?

    前言 hello,大家好,我是bigsai,好久不见,甚是想念! 在日常生活中,很多人喜欢玩游戏,因为游戏中有着对抗博弈.控制的喜悦,用灵魂指法完成一波靓丽的操作. 但实际上,你的按键都是对应代码中一 ...

  3. 前端yyyy-mm-dd格式 计算一段工作日后,日期

    //计算一段工作日后,日期getWorkday(dat, itervalByDay) { function formatTen(f) { if (parseInt(f, 10) < 10) { ...

  4. 【JAVA】笔记(5)--- final;抽象方法;抽象类;接口;解析继承,关联,与实现;

    final: 1.理解:凡是final修饰的东西都具有了不变的特性: 2.修饰对象: 1)final+类--->类无法被继承: 2)final+方法--->方法无法被覆盖: 3)final ...

  5. Effective C++ 总结笔记(四)

    五.实现 26.尽可能延后变量定义式的出现时间 尽可能延后变量定义式的出现,甚至应该尝试延后这份定义直到能够给他初值实参为止,这样不仅能避免构造和析构非必要对象,避免无意义的default行为,也可增 ...

  6. 【jmeter学习】Concurrency Thread Group阶梯式加压测试

    安装步骤 1.配置Concurrency Thread Group线程组 下载jmeter插件管理:https://jmeter-plugins.org/install/Install/ 2.配置插件 ...

  7. centos7.1使用kubeadm部署kubernetes 1.16.2的master高可用

    机器列表,配置域名解析 cat /etc/hosts192.168.200.210 k8s-master1192.168.200.211 k8s-master2192.168.200.212 k8s- ...

  8. [cf10E]Greedy Change

    对于$w$的表示方案,可以用序列描述,即$x_{i}$表示第$i$种货币的数量 贪心策略得到的方案即是(对应序列)字典序最大的方案,并定义最优策略得到的方案为在最小化货币总数的基础上,(对应序列)字典 ...

  9. [bzoj4652]循环之美

    对于一个分数x/y(x和y互素),在k进制下为纯循环当且仅当y和k互素证明:任意一个分数都可以写成0.abbbbbbbb的形式(不妨假设a尽量短),设a的位数为l1,b的位数为l2,那么原分数即$\f ...

  10. 在安卓开发中需要格式化桌面icon图标

    使用以下在线工具即可实现http://www.makeicon.cc/home/index