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 有 ...
随机推荐
- dart系列之:dart语言中的内置类型
目录 简介 Null 数字 字符串 布尔值 列表 set和map 简介 和所有的编程语言一样,dart有他内置的语言类型,这些内置类型都继承自Object,当然这些内置类型是dart语言的基础,只有掌 ...
- springboot单元测试 JUnit5
JUnit5简介 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库 JUnit 5官方文档 作为最新版本的JUnit框架,JUnit5与之前版本的JUnit框架有很 ...
- PLSQL批量执行SQL文件方法
当需要执行多个sql文件,或者某个脚本中,sql语句数量很多时,手动逐个逐条执行不是一个明智的选择. PLSQL为我们提供了便捷的工具.使用方式如下: [工具]--[导入表]--[SQL插入]--[选 ...
- Qt Creator 源码学习笔记02,认识框架结构
阅读本文大概需要 6 分钟 在上一篇大概了解了关于Qt Creator 基础知识后[1],本篇先学习下框架基本结构,这样能够清晰的知道这个框架当中包含哪些文件.文件夹.工程文件,这些文件分别代表什么意 ...
- [cf1236F]Alice and the Cactus
首先,我们要用到期望的一个性质: 对于两个随机变量$X$和$Y$(不需要相互独立),有$E(X+Y)=E(X)+E(Y)$ 另外,对于一个仙人掌,令$n$为点数,$m$为边数,$c$为简单环个数,$X ...
- SpringCloud微服务实战——搭建企业级开发框架(二十七):集成多数据源+Seata分布式事务+读写分离+分库分表
读写分离:为了确保数据库产品的稳定性,很多数据库拥有双机热备功能.也就是,第一台数据库服务器,是对外提供增删改业务的生产服务器:第二台数据库服务器,主要进行读的操作. 目前有多种方式实现读写分离,一种 ...
- Codeforces 1466G - Song of the Sirens(哈希)
Codeforces 题面传送门 & 洛谷题面传送门 事实证明,有的难度评分不算很高.涉及的知识点不算很难的题目也能出得非常神仙 首先考虑如何暴力求答案.注意到一个文本串 \(T\) 在 \( ...
- [ARC098B] Xor Sum 2
关于异或运算和代数和运算有很不错的性质: \(xor_{i = 1} ^ {n}a_i \leq \sum_{i = 1} ^ n a_i\) 所以我们考虑一段区间按题目来说是合法的,即 \(xor_ ...
- 【2020五校联考NOIP #4】今天的你依旧闪耀
题面传送门 题意: 对于一个长度为 \(n\)(\(n\) 为偶数)的排列 \(p\),定义一次"变换"后得到的排列 \(p'\) 为: \(p'_i=\begin{cases}p ...
- .NET6控制台程序使用quartz.net
1.新建一个名为"ConsoleQuartz"的.NET6控制台程序. 2.nuget中安装Quartz和Quartz.Plugins,这2个DLL. 3.新建一个HelloQua ...