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. Chapter 1:Create You First 3D Scene With Three.js

    1,各浏览器对WebGL的支持 手机浏览器对WebGL的支持: 书的源码:https://github.com/josdirksen/learning-threejs 第一次用浏览器打开代码可能无法正 ...

  2. Python编程环境设置

    第1节.Python编程环境设置 一.sublime相关 1.sublime REPL插件安装 (1)安装 先打开插件安装面板:ctrl+shift+P 输入install ,选择Package Co ...

  3. [cf1528F]AmShZ Farm

    考虑$a_{i}$是"more-equal"的组合意义,有以下构造-- 有$n$个位置,每一次选择一个位置$a_{i}$,在$a_{i}$之后(包括$a_{i}$)的第一个空位上停 ...

  4. [atAGC048E]Strange Relation

    考虑对于$\{a_{i+1},...,a_{n}\}$,在其前面插入$a_{i}$对$x_{i}$的影响(不考虑$a_{1}$到$a_{i-1}$): 1.$x_{i}=0$,因为其前面没有数字了 2 ...

  5. Github树型插件--Octotree

    octotree 是一款chrome插件,用于将 GitHub 项目代码以树形格式展示,而且在展示的列表中,我们可以下载指定的文件,而不需要下载整个项目. 官网地址:https://www.octot ...

  6. 回顾Servlet开发

    1.建立的文件 2.servlet package com.shao.servlet; import javax.servlet.ServletException; import javax.serv ...

  7. 使用 FairyGUI 0代码实现游戏界面左右切换

    制作原因:项目中需要实现主界面中五个界面左右切换,包含点击切换和滑动切换,并且点击和滑动都需要关联表现,原先项目使用ugui实现该效果,代码量大,容易出问题,不好管控,使用FGUI后不需一行代码即可相 ...

  8. mabatis的mapper文件找不到-ssm升级maven常见问题

    手里项目之前是普通ssm的,打算用业余时间升级一把. 1.首先,搭建好maven的ssm项目. 2.配置好jdk,tomcat环境,先启动. 3.启动没问题后将maven目录结构布置好后直接将原有项目 ...

  9. 『MdOI R1』Treequery

    我们可以思考怎么做呢. 首先我们需要进行一些分类讨论: 我们先思考一下如果所有关键点都在 \(p\) 的子树内, 那显然是所有关键点的 \(Lca\) 到 \(p\) 距离. 如果所有关键点一些在 \ ...

  10. python故障

    问题: ImportError: No module named dns.resolver 解决: 通过包管理工具pip安装dnspython pip install dnspython