当前位置:网站首页>Go语学习笔记 - 处理超时问题 - Context使用 从零开始Go语言
Go语学习笔记 - 处理超时问题 - Context使用 从零开始Go语言
2022-08-02 04:58:00 【m0_67400972】
学习笔记,写到哪是哪。
最近看了看go语言Context的使用,觉着很神奇也很便捷。
说到context,我在学习golang的时候看到很多库都用到了,简而言之,context可以处理多个goroutine之间的交互问题。类比于其他语言,你可能需要自己定义一个线程安全对象,通过线程安全对象来实现多个线程间的交互操作。golang直接有个默认包context,可以省掉每次定义的过程,还是很方便的。
具体关于Context的使用,我就不细说了,网上很多。
本文主要将我用context来实现一种超时场景的处理。
demo1
先使用context.WithTimeout方法来实现超时处理。
代码如下:
package main
import (
"context"
"fmt"
"time"
)
func handle() {
//构建超时上下文
_ctx, _cancel := context.WithTimeout(context.Background(), 5*time.Second)
go work(_ctx)
time.Sleep(6 * time.Second)
_cancel()
}
//工作
func work(ctx context.Context) {
for {
time.Sleep(1 * time.Second)
select {
case <-ctx.Done():
fmt.Println("work done")
default:
fmt.Println("working")
}
}
}
func main() {
handle()
}
代码说明
1、 构建一个5秒超时的上下文传入goroutine,work方法轮询上下文状态。
执行结果
demo2
先使用context.WithDeadline方法来实现超时处理。
代码如下:
package main
import (
"context"
"fmt"
"time"
)
func handle1() {
//构建超时上下文
_ctx, _cancel := context.WithDeadline(context.Background(), time.Now().Add(5*time.Second))
go work1(_ctx)
time.Sleep(6 * time.Second)
_cancel()
}
//工作1
func work1(ctx context.Context) {
for {
time.Sleep(1 * time.Second)
if _deadline, _a := ctx.Deadline(); _a {
if time.Now().After(_deadline) {
fmt.Println("after deadline")
break
}
}
select {
case <-ctx.Done():
fmt.Println("work done")
default:
fmt.Println("working")
}
}
}
func main() {
handle1()
}
代码说明
1、注意WithDeadline后面的时间参数方式,和WithTimeout不同。
2、这里在轮训前判断一下是否当前时间已经超过deadline,如果超过了直接跳出。
执行结果
小结
context还有很多用法,需要在项目中多使用,以后分享更多感受。
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
猜你喜欢
Minecraft 1.18.1, 1.18.2 module development 23.3D animation armor production
【MLT】MLT多媒体框架生产消费架构解析(一)
2021年软件测试面试题大全
力扣 2127. 参加会议的最多员工数 拓扑剪枝与2360补充
来自雪域高原的馈赠——大凉山高原生态糖心苹果
matlab simulink 飞机飞行状态控制
PyQt5_pyqtgraph mouse draws straight lines on line charts
数据湖:流计算处理框架Flink概述
UE4 创建暂停和结束游戏UI
来自雪域高原的馈赠——大凉山高原生态糖心苹果
随机推荐
Does Conway's Law Matter for System Architecture?
Learn about the sequential storage structure of binary tree - heap
[QNX Hypervisor 2.2用户手册]9.17 tolerance
Minecraft 1.18.1, 1.18.2 module development 23.3D animation armor production
数学建模笔记:TOPSIS方法(优劣解距离法)和熵权法修正
【MLT】MLT多媒体框架生产消费架构解析(一)
你要的在这里,自己维护的石墨文档
MySQL大批量造数据
UE4 AI行为树实现随机和跟随移动
SQL数据表增加列
A Practical Arrangement of Map GIS Development Matters (Part 1)
mysql 存储过程详解
Digicert EV证书签名后出现“证书对于请求用法无效”的解决方案
300M级mysql数据库跨版本迁移流程
PDF file conversion format
MySQL 5.7详细下载安装配置教程
MySQL 8.0.28 version installation and configuration method graphic tutorial
interrupt()、interrupted()和isInterrupted()你真的懂了吗
Towhee 每周模型
Anatomy of Unreal Playback System (Part 1)