go的context

news2024/10/6 18:27:45

在这里插入图片描述
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
在这里插入图片描述

  • 推荐:「stormsha的主页」👈,持续学习,不断总结,共同进步,为了踏实,做好当下事儿~

  • 专栏导航

    • Python系列: Python面试题合集,剑指大厂
    • Git系列: Git操作技巧
    • GO系列: 记录博主学习GO语言的笔记,该笔记专栏尽量写的试用所有入门GO语言的初学者
    • 数据库系列: 详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 运维系列: 总结好用的命令,高效开发
    • 算法与数据结构系列: 总结数据结构和算法,不同类型针对性训练,提升编程思维

    非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

    💖The Start💖点点关注,收藏不迷路💖

    📒文章目录

      • Context 的基本概念
      • 创建 Context
      • 使用 Context 的技巧
        • 1. 传递截止时间
        • 2. 处理超时
        • 3. 取消操作
        • 4. 值的传递
        • 5. 避免错误的取消
        • 6. 避免使用全局 Context
      • 总结


内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容
在 Go 语言的并发编程中,context 包扮演着至关重要的角色。它不仅帮助开发者在多个 goroutine 之间传递请求和响应,还提供了一种优雅的方式来取消操作、传递截止时间以及处理超时。本文将深入探讨 context 的使用技巧,旨在帮助开发者更好地理解和应用这一强大的工具。

Context 的基本概念

在 Go 语言中,context 是一个用于在 API 之间传递请求范围的值和取消信号的包。它允许程序中的多个 goroutine 以一种安全的方式协调工作。context 包的设计初衷是为了解决并发编程中的一些常见问题,比如:

  • 传递请求的截止时间。
  • 传递请求取消信号。
  • 传递请求的生命周期信息。

创建 Context

创建一个 context 非常简单,可以使用 context.Background()context.TODO() 来创建一个新的空 context。但更常见的做法是使用 WithCancel(), WithDeadline(), 或 WithTimeout() 等函数来创建一个带有特定属性的 context

ctx, cancel := context.WithCancel(context.Background())
defer cancel()

这段代码创建了一个可以被取消的 contextcancel 函数在 goroutine 结束时被调用,以确保资源被正确释放。

使用 Context 的技巧

1. 传递截止时间

使用 WithDeadline() 可以为 context 设置一个截止时间。如果操作在这个时间之前没有完成,context 将被自动取消。

ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(5*time.Second))
defer cancel()

// 模拟长时间运行的操作
time.Sleep(3 * time.Second)

2. 处理超时

WithTimeout()WithDeadline() 的快捷方式,它允许你直接指定一个超时时间而不是截止时间。

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// 操作...

3. 取消操作

在某些情况下,你可能需要在满足特定条件时取消正在进行的操作。使用 WithCancel() 可以轻松实现这一点。

ctx, cancel := context.WithCancel(context.Background())

go func() {
    // 模拟长时间运行的goroutine
    time.Sleep(3 * time.Second)
    cancel()
}()

// 等待goroutine完成或取消
select {
case <-ctx.Done():
    fmt.Println("操作被取消")
case <-time.After(5 * time.Second):
    fmt.Println("超时")
}

4. 值的传递

WithValue() 允许你将请求范围的值传递给 context。这在需要在不同层级的函数之间共享数据时非常有用。

ctx := context.WithValue(context.Background(), "key", "value")

// 在其他goroutine中访问值
value := ctx.Value("key").(string)

5. 避免错误的取消

在使用 context 时,一个常见的错误是忘记调用 cancel 函数。这可能导致 goroutine 泄露。确保在函数的 defer 块中调用 cancel,以避免这种情况。

6. 避免使用全局 Context

尽量避免使用全局的 context,因为它们可能会无意中被多个 goroutine 共享,导致难以追踪的错误。

总结

context 是 Go 语言中处理并发和请求生命周期的强大工具。通过合理使用 context,开发者可以编写出更加健壮、易于维护的并发代码。本文介绍了一些 context 的使用技巧,希望能够帮助开发者更深入地理解并应用这一功能。


🔥🔥🔥道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

💖The End💖点点关注,收藏不迷路💖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1842037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL】事务二

事务二 1.数据库并发的场景2.读-写2.1 3个记录隐藏字段2.2 undo日志2.3 模拟 MVCC2.4 Read View2.5 RR 与 RC的本质区别 3.读-读4.写-写 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我…

音乐人王海军新歌《我没让你骄傲你却视我如宝》上线 好评如潮

时光飞逝&#xff0c;岁月如歌&#xff0c;华语乐坛向来不缺乏岁月金曲的沉淀与洗礼。2024&#xff0c;一首名为《我没让你骄傲你却视我如宝》的歌曲突然火爆全网&#xff0c;一经发行&#xff0c;便立刻赢得了广大歌迷朋友一致好评&#xff0c;共鸣内心&#xff0c;带来温暖与…

计算机网络 —— 应用层(FTP)

计算机网络 —— 应用层&#xff08;FTP&#xff09; FTP核心特性&#xff1a;运作流程&#xff1a; FTP工作原理主动模式被动模式 我门今天来看应用层的FTP&#xff08;文件传输协议&#xff09; FTP FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#x…

Docker+MySQL:打造安全高效的远程数据库访问

在现代应用开发和部署中&#xff0c;数据库是关键组件之一。无论是开发环境还是生产环境&#xff0c;快速、可靠地部署和管理数据库都是开发人员和运维人员面临的常见挑战之一。 Docker是一种流行的容器化技术&#xff0c;它使得应用程序的部署和管理变得非常简单和高效。通过使…

工业制造领涉及的8大常见管理系统,如mes、scada、aps、wms等

在工业生产和制造领域有一些常见的管理系统&#xff0c;很多小伙伴分不清&#xff0c;这次大美B端工场带领大家了解清楚。 MES&#xff08;Manufacturing Execution System&#xff0c;制造执行系统&#xff09;&#xff1a; MES是一种用于监控、控制和优化生产过程的软件系统…

Java众包招聘零工兼职任务发布人力资源招聘小程序

&#x1f4e2;众包招聘零工兼职任务发布——人力资源招聘小程序全攻略 一、引言&#xff1a;打破传统&#xff0c;开启零工新时代 随着社会的快速发展&#xff0c;零工经济已成为一种不可忽视的就业模式。为了满足广大求职者与招聘者的需求&#xff0c;众包招聘零工兼职任务发…

Python中文自然语言处理(NLP)中文分词工具库之pkuseg使用详解

概要 在中文自然语言处理(NLP)中,分词是一个基础且关键的任务。pkuseg 是由北京大学开发的一个中文分词工具,专为处理现代汉语而设计。它采用了先进的深度学习技术,能够准确地进行中文分词,同时支持自定义词典和多领域分词。本文将详细介绍 pkuseg 库,包括其安装方法、…

红黑树(数据结构篇)

数据结构之红黑树 红黑树(RB-tree) 概念&#xff1a; 红黑树是AVL树的变种&#xff0c;它是每一个节点或者着成红色&#xff0c;或者着成黑色的一棵二叉查找树。对红黑树的操作在最坏情形下花费O(logN)时间&#xff0c;它的插入操作使用的是非递归形式实现红黑树的高度最多是…

1分钟解决海康威视摄像头网页预览失败显示纯灰色问题

先用老IE浏览器登录&#xff0c;会提醒下载插件 下载这个Web的插件安装后&#xff0c;重开网页就都能看了

MacBook Air M3的电脑怎么样 新买MacBook Air提示内存不足 苹果电脑内存不够用怎么办

Apple的MacBook Air系列一直是轻薄便携笔记本电脑的代表&#xff0c;最新推出的MacBook Air M3因其出色的性能和优雅的设计而受到广泛关注。然而&#xff0c;许多用户在购买全新的MacBook Air后反应他们遇到了内存不足的提示。 本文将探讨MacBook Air M3的电脑怎么样&#xff0…

k8s自动补全工具和UI管理界面

分享两个有利于K8S的工具 目录 分享两个有利于K8S的工具 一、部署Dashboard&#xff08;主节点&#xff09; 介绍 1.1、查看集群状态 1.2、下载yaml文件并运行Dashboard 1.3、部署服务 1.4、创建访问账户、获取token&#xff08;令牌&#xff09; 1.5、浏览器访问Dash…

【K8s】专题五(5):Kubernetes 配置之热更新工具 Reloader

以下内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01;如果对您有帮助&#xff0c;烦请点赞、关注、转发&#xff01;欢迎扫码关注个人公众号&#xff01; 目录 一、基本介绍 二、工作原理 三、部署方法 四、使用方法 一、基本介绍 Reloader 是一个用…

Git 学习笔记(超详细注释,从0到1)

Git学习笔记 1.1 关键词 Fork、pull requests、pull、fetch、push、diff、merge、commit、add、checkout 1.2 原理&#xff08;看图学习&#xff09; 1.3 Fork别人仓库到自己仓库中 记住2个地址 1&#xff09;上游地址&#xff08;upstream地址&#xff09;&#xff1a;http…

PFA方桶聚四氟乙烯溢流槽PFA酸洗槽耐腐蚀浸泡桶15L

PFA浸泡桶又叫PFA酸缸、PFA清洗槽、PFA方槽。 主要用于浸泡、清洗带芯片硅片电池片的花篮。由于PFA的特点它能耐受清洗溶液的腐蚀性&#xff0c;同时金属元素值低&#xff0c;无溶出无析出&#xff0c;不会污染芯片晶圆等。 半导体晶圆清洗槽尺寸可按要求定做。同时&#xff0…

ATA-4052C高压功率放大器在新能源汽车安全测试中的应用

新能源汽车的崛起已经改变了汽车行业的格局&#xff0c;为环境友好型交通方式提供了更多的选择。为了确保这些新型汽车的安全性和可靠性&#xff0c;进行全面的安全测试是至关重要的。高压功率放大器在新能源汽车的安全测试中发挥着重要的作用&#xff0c;本文将介绍其应用以及…

大模型什么时候应该进行微调

经常会遇到一个问题——LinkedIn 上的人们问我如何微调 LLaMA 等开源模型&#xff0c;试图找出销售 LLM 托管和部署解决方案的业务案例的公司&#xff0c;以及试图利用人工智能和大模型应用于他们的产品。但当我问他们为什么不想使用像 ChatGPT 这样的闭源模型时&#xff0c;他…

真空玻璃可见光透射比检测 玻璃制品检测 玻璃器皿检测

建筑玻璃检测 防火玻璃、钢化玻璃、夹层玻璃、均质钢化玻璃、平板玻璃、中空玻璃、真空玻璃、镀膜玻璃夹丝玻璃、光栅玻璃、压花玻璃、建筑用U形玻璃、镶嵌玻璃、玻璃幕墙等 工业玻璃检测 钢化安全玻璃、电加温玻璃、玻璃、半钢化玻璃、视镜玻璃、汽车安全玻璃、汽车后窗电热…

智慧油品营销调度大屏可视化应用

图扑应用自研 HT 搭建的 2D 智慧油品营销调度中心大屏展示模块主要以综合业务支撑平台为架构&#xff0c;全方位展示公司主要概况、业务运行、管理服务等多项内容&#xff0c;在内外部交流和品牌管理提升等方面发挥了积极作用。

接口提示信息国际化, 调用LibreTranslate 离线翻译, 国际化支持

文章目录 背景实现方式步骤下载并部署离线翻译服务;前端接入 背景 将接口返回内容进行翻译, 以适配多语言需求; 实现方式 前端拦截接口返回内容, 调用离线翻译服务进行翻译, 翻译之后再进行相应的提示 参考资料: 离线翻译服务: https://github.com/LibreTranslate/LibreTra…

Spring Boot 3 整合 SpringDoc OpenAPI 生成接口文档

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…