当前位置:网站首页>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开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
- Scala basics [common method supplement, pattern matching]
- CodeTON Round 2 (Div. 1 + Div. 2, Rated, Prizes!) C题
- 物联网通信协议全解析
- [QNX Hypervisor 2.2用户手册]9.18 unsupported
- MYSQL 唯一约束
- 【七夕】是时候展现专属于程序员的“浪漫”了
- Learn about the sequential storage structure of binary tree - heap
- Mysql存储json格式数据
- Android Studio 实现登录注册-源代码 (连接MySql数据库)
- SQL数据表增加列
猜你喜欢

YOLOV5学习笔记(四)——项目目录及代码讲解

Jmeter使用多线程测试web接口

A Practical Arrangement of Map GIS Development Matters (Part 1)

【云原生】什么是CI/CD? | CI/CD 带来的好处

Minecraft 1.18.1, 1.18.2 module development 23.3D animation armor production

迅为RK3568开发板编译Buildroot-全自动编译

MySQL(7)

认识消防报警联网中CAN光纤转换器的光纤接口和配套光纤线缆

MySQL 灵魂 16 问,你能撑到第几问?

Android studio连接MySQL并完成简单的登录注册功能
随机推荐
选择黑盒测试用例设计方法的综合策略方案总结
来自雪域高原的馈赠——大凉山高原生态糖心苹果
软件测试常见的问题
Qt FAQ
力扣练习——39 正方形数组的数目
UE4 局域网联机案例
CubeSat Light-1
从头开始实现YOLOV3
MySQL multi-table association one-to-many query to get the latest data
07-传统的生产者消费者问题、防止虚假唤醒
简道云-灵活易用的应用搭建平台
【HCIE】NO.45 Hub and Spoke配置案例
翻转(DAY 97)
MYSQL 唯一约束
MySQL 5.7详细下载安装配置教程
UE4 蓝图实现AI随机移动
mysql 存储过程详解
【七夕】是时候展现专属于程序员的“浪漫”了
Learn about the sequential storage structure of binary tree - heap
Luogu P2437 Bee Route