3.1 go context代码示例
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代码示例的更多相关文章
- 微信消息接收 验证URL有效性 C#代码示例
官方文档只给出了PHP的示例代码 开发者提交信息后,微信服务器将发送GET请求到填写的URL上,GET请求携带四个参数: 参数 描述 signature 微信加密签名,signature结合了开发者填 ...
- ffmpeg音频播放代码示例-avcodec_decode_audio4
一.概述 最近在学习ffmpeg解码的内容,参考了官方的教程http://dranger.com/ffmpeg/tutorial03.html,结果发现这个音频解码的教程有点问题.参考了各种博客,并同 ...
- 中文代码示例之NW.js桌面应用开发初体验
先看到了NW.js(应该是前身node-webkit的缩写? 觉得该起个更讲究的名字, 如果是NorthWest之意的话, logo(见下)里的指南针好像也没指着西北啊)和Electron的比较文章: ...
- Ice简介+Qt代码示例
1.ICE是什么? ICE是ZEROC的开源通信协议产品,它的全称是:The Internet Communications Engine,翻译为中文是互联网通信引擎,是一个面向对象的中间件,它封装并 ...
- php发送get、post请求的6种方法代码示例
本文主要展示了php发送get.post请求的6种方法的代码示例,分别为使用file_get_contents .fopen.fsockopen.curl来发送GET和POST请求,代码如下: 方法1 ...
- MapReduce序列化及分区的java代码示例
概述 序列化(Serialization)是指把结构化对象转化为字节流. 反序列化(Deserialization)是序列化的逆过程.把字节流转为结构化对象. 当要在进程间传递对象或持久化对象的时候, ...
- MapReduce框架结构及代码示例
一个完整的 mapreduce 程序在分布式运行时有三类实例进程: 1.MRAppMaster:负责整个程序的过程调度及状态协调 2.MapTask:负责 map 阶段的整个数据处理流程 3.Redu ...
- Spring 注解学习 详细代码示例
学习Sping注解,编写示例,最终整理成文章.如有错误,请指出. 该文章主要是针对新手的简单使用示例,讲述如何使用该注释,没有过多的原理解析. 已整理的注解请看右侧目录.写的示例代码也会在结尾附出. ...
- 高级渲染技巧和代码示例 GPU Pro 7
下载代码示例 移动设备正呈现着像素越来越高,屏幕尺寸越来越小的发展趋势. 由于像素着色的能耗非常大,因此 DPI 的增加以及移动设备固有的功耗受限环境为降低像素着色成本带来了巨大的压力. MSAA 有 ...
随机推荐
- 一维前缀和 连续数组和为k
给定一个整数数组和一个整数 k ,请找到该数组中和为 k 的连续子数组的个数. 滑动窗口没办法解决有负数的情况 方法一: 预处理 前缀和 sum_ij = preSum[j] - preSum[i-1 ...
- Java使用iText7生成PDF
前言 我们之前使用js库html2canvas + jspdf实现html转PDF.图片,并下载(详情请戳:html页面转PDF.图片操作记录),大致原理是将页面塞到画布里,以图片的方式放到PDF中, ...
- 【Git 系列】一个超好用的命令你会用吗?
stash在英文意思是隐藏.git stash 的作用也是隐藏没完成的代码,防止它干扰别人或者新分支的工作. 一.背景 1.1 我们经常会遇到这样的情况 正在 dev 分支开发新功能,做到一半时有人过 ...
- Python基础(range)
arr = [1,2,3,4,5,6,7,8,9] for i in range(0,len(arr),2): print(arr[i],end=' | ') brr = arr[0:len(arr) ...
- mongodb(一)
文档是 MongoDB 的核心,类似于 SQLite 数据库(关系数据库)中的每一行数据.多个键及其关联的值放在一起就是文档.在 Mongodb 中使用一种类 json 的 bson 存储数据,bso ...
- JVM 是用什么语言写的?
JAVA中就虚拟机是其它语言开发的,用的是C语言+汇编语言 基于此之上就是JAVA本身了 虚拟机只起到解析作用另外,JAVA并不比C语言慢,说JAVA慢一般是九十年代那时候的JAVA, 而现在 在 ...
- [loj6734]图上的游戏
考虑原图是一条链的情况-- 思路:随机一个点$x$,将其所在段(边集)再划分为两段,重复此过程即可得到该链 实现上,(从左到右)维护每一段的左端点和边集,二分找到最后一个删除后$x$到根不连通的段,那 ...
- 『与善仁』Appium基础 — 10、Appium基本原理
目录 1.Appium自动化测试架构 2.Appium架构图 3.Session说明 4.Desired Capabilities说明 5.Appium Server说明 6.Appium Clien ...
- 智能 Request 推荐,K8s 资源利用率提升 252%
作者 王孝威,FinOps 认证从业者,腾讯云容器服务产品经理,热衷于为客户提供高效的 Kubernetes 使用方式,为客户极致降本增效服务. 余宇飞,FinOps 认证从业者,腾讯云专家工程师,从 ...
- docker创建mongodb并且测试代码
mongodb docker 安装mongodb-创建用户 docker run -itd --name mongo -p 27017:27017 mongo --auth 进入数据库添加密码 ...