首页 > 其他分享 >go并发的取消操作

go并发的取消操作

时间:2023-10-23 19:00:44浏览次数:26  
标签:context lincyang 取消 并发 Context 操作 go Go 超时

Go的并发模式:使用Context进行资源管理

原创 lincyang lincyang新自媒体 2023-10-23 10:00 发表于河北 收录于合集#GO进阶16个

大家好!我是[lincyang]。

今天我们要一起探讨Go语言中的一个核心话题:使用Context进行资源管理。

什么是Context?

Context,即上下文,是Go语言中用于控制多个goroutine之间交互的对象。它在context包中定义,成为Go并发编程中不可或缺的一部分。Context主要用于三个方面:超时控制、取消操作和元数据传递。

超时控制

在网络请求或数据库查询等可能耗时的操作中,设置超时是一种常见的需求。Context通过WithTimeout函数,提供了一种优雅的超时控制方法。

取消操作

在一些场景下,比如用户取消了正在进行的操作,或者某个操作依赖的其他操作失败了,我们需要能够取消正在进行的操作。Context通过WithCancel函数,使这一切变得简单。

元数据传递

在微服务或网络请求等场景中,我们经常需要在多个服务或多个函数之间传递额外的信息,如请求ID、用户ID等。Context的WithValue函数可以用于在多个goroutine之间安全地传递这些信息。

为什么需要Context?

在并发编程中,尤其是在处理分布式系统时,我们经常需要解决以下几类问题:

  1. 同步与通信:多个goroutine需要协同工作。
  2. 资源管理:需要合理地分配和回收资源。
  3. 错误处理与传播:需要能够捕获和处理错误,并在需要的时候传播。
Context就是为了解决这些问题而设计的。它提供了一种统一的接口,让我们不需要通过复杂的通道(channel)操作或全局变量就能解决这些问题。

如何使用Context?

基础用法:

超时控制
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()

select {
case <-time.After(3 * time.Second):
   fmt.Println("操作成功")
case <-ctx.Done():
   fmt.Println("操作超时")
}
在这个例子中,我们使用context.WithTimeout创建了一个会在2秒后自动取消的Context。然后我们在select语句中等待一个可能需要3秒才能完成的操作。由于Context会在2秒后取消,所以这个操作会因为超时而被中断。
取消操作
ctx, cancel := context.WithCancel(context.Background())
go func() {
   time.Sleep(2 * time.Second)
   cancel()
}()

select {
case <-time.After(3 * time.Second):
   fmt.Println("操作成功")
case <-ctx.Done():
   fmt.Println("操作被取消")
}
在这个例子中,我们创建了一个可以被取消的Context,并在一个goroutine中在2秒后取消它。与超时控制类似,这个长时间运行的操作也会被中断。

高级用法:

传递元数据
ctx := context.WithValue(context.Background(), "userID", 1)
go HandleRequest(ctx)
HandleRequest函数中,你可以这样获取userID
userID := ctx.Value("userID").(int)
这样,我们就可以在不改变函数签名的情况下,传递额外的信息。

故障排查

在一个大型的分布式系统中,故障排查是一个非常复杂的任务。Context的元数据传递功能可以帮助我们更容易地追踪一个请求的完整生命周期。例如,我们可以在Context中添加一个唯一的请求ID,然后在系统的各个组件中都打印这个ID相关的日志。这样,当一个请求出问题时,我们可以通过这个ID快速地找到所有相关的日志信息。

资源回收

在使用Context进行资源管理时,一个常见的模式是使用defer语句来确保资源被正确回收。例如:
goCopy code
func ProcessRequest(ctx context.Context) {
  dbConn, err := acquireDBConnection()
  if err != nil {
      // handle error
      return
  }
  defer releaseDBConnection(dbConn)

  // use dbConn
}
在这个例子中,我们使用defer语句来确保数据库连接在函数返回时会被正确释放,无论函数是正常返回还是因为错误或超时而返回。

最佳实践

  1. 函数参数传递:Context应该作为函数的第一个参数,这已经成为一种公认的最佳实践。
  2. 不可变性:创建后,Context是不可变的。如果你需要更改Context中的某个值,应该创建一个新的Context。
  3. 超时控制:使用context.WithTimeout来控制可能长时间运行的操作,而不是依赖外部的超时设置。

总结

Context在Go的并发编程中起着至关重要的作用。它不仅简化了代码,提高了程序的可维护性,还能帮助我们更有效地利用系统资源。通过合理地使用Context,我们可以更容易地实现复杂的并发逻辑,更高效地管理资源,并更方便地进行故障排查。

图片



往期推荐

Go的模板引擎:HTML模板与文本模板解析

Go的函数式编程:Lambda与闭包的魅力

大龄程序员的职业发展之路究竟在何方

Go的错误处理新视角:使用pkg/errors库

Go的反射机制:动态编程的秘密武器

SpringBoot 玩一玩代码混淆,防止反编译代码泄露

Go项目CI/CD实践:从代码到部署

清风徐来,技术潮汐如约而至, [lincyang]在此,与你共赴知识的盛宴。十载Java征程,穿梭代码的森林, 架构之谜,微服务之魅,尽在指尖流转。云原生的天空,星星点点皆是数据, 微信公众号上,技术干货与职场感悟交相辉映。愿分享的文字,如泉水滴入心湖, 激发思考的波澜,引导学习的航向。AI工具的世界,是未来的奥秘宝藏, 待你我探索,寻找智慧的火种。不仅要深入技术,更要拓宽眼界, 与读者共建,技术交流的桥梁。日日更新,为知识而狂, 期待你我,在这片技术的海洋中, 一同起航,一同前行,一同创新。 lincyang

赞赏二维码喜欢作者

收录于合集 #GO进阶  16个 上一篇Go的模板引擎:HTML模板与文本模板解析   阅读原文 阅读 39 lincyang新自媒体 ​ 喜欢此内容的人还喜欢   Go的错误处理新视角:使用pkg/errors库     我看过的号 lincyang新自媒体 不看的原因   掌握Go的运行时:从编译到执行     TechLeadCloud 不看的原因   深入理解 Go 语言 select 语句     Java千练 不看的原因   关注公众号后可以给作者发消息            

人划线

 

标签:context,lincyang,取消,并发,Context,操作,go,Go,超时
From: https://www.cnblogs.com/cheyunhua/p/17783222.html

相关文章

  • 在goland上部署环境用于区块链开发
    1.下载ubantu虚拟环境,使用Linux。(直接在goland中的plugin搜索下载)2.在plugin中搜索Remotedevelopmentconnector下载,用于远程开发3.在terminal中使用ubantu,下载NVM用于管理Node.js版本的工具curl-o-https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh|bas......
  • javascript: Sorting Algorithms
     /***fileSort.js*ide:vscodeJavaScriptSortingAlgorithms*插件:IntelliSense,JSDoc,CodeLens,DebuggerforChrome,静态代码检查:ESLint,JSHint,FlowLangugaeSupport,StandardJS-JavaScriptStandardStyle,koroFileHeader(文件头注释),测试插件:Mochasidebar,M......
  • go-ethereum-master/core/vm/stack.go 源码阅读
    //Copyright2014Thego-ethereumAuthors//Thisfileispartofthego-ethereumlibrary.////Thego-ethereumlibraryisfreesoftware:youcanredistributeitand/ormodify//itunderthetermsoftheGNULesserGeneralPublicLicenseaspublishedby......
  • Oracle10gOCP042题库121166题共168题
    121.Youwanttocreateanewoptimizeddatabaseforyourtransactionalproductionenvironmenttobeusedbyafinancialapplication.Whilecreatingthedatabase,youwanttheOraclesoftwaretotakecareofallbasicsettingstooptimizethedatabasep......
  • Oracle10gOCP042题库130题共168题
    声明:对于答案的相关的说明,是个人对Oracle的理解。1.Becauseofapoweroutage,instancefailurehasoccurred.Fromwhatpointintheredologdoesrecoverybeginandwheredoesitend?A.CurrentredologandinactiveredologB.Checkpointpositiontoendofr......
  • Oracle10gOCP042题库3170题共168题
    31.WhichtwostatementsaretrueregardingthedatabaseinARCHIVELOGmode?(Choosetwo.) A)Youhavetoshutdownthedatabasetoperformthebackups. B)Archivinginformationiswrittentothedatafilesandredologfiles. C)Youcanperformcomp......
  • Oracle10gOCP042题库71120题共168题
    71.Yourdatabaseinstanceisstartedusingtheserverparameterfile(SPFILE).Controlfilesaremultiplexedandstoredondifferentdisks.Becauseofadiskfailure,youlostoneofthesecontrolfiles.Youreplacedthedamageddisk.Whatisthecorre......
  • Go语言代码断行规则详解
    本文深入探讨了Go语言中代码断行的各个方面,从基础概念到实际应用实践。关注【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业......
  • 图书推荐与管理系统Python+协同过滤推荐算法+Django网页界面
    一、介绍图书管理与推荐系统。使用Python作为主要开发语言。前端采用HTML、CSS、BootStrap等技术搭建界面结构,后端采用Django作为逻辑处理,通过Ajax等技术实现数据交互通信。在图书推荐方面使用经典的协同过滤算法作为推荐算法模块。主要功能有:角色分为普通用户和管理员普通用户可注......
  • 图书推荐管理系统Python+Django网页界面+协同过滤推荐算法
    一、介绍图书管理与推荐系统。使用Python作为主要开发语言。前端采用HTML、CSS、BootStrap等技术搭建界面结构,后端采用Django作为逻辑处理,通过Ajax等技术实现数据交互通信。在图书推荐方面使用经典的协同过滤算法作为推荐算法模块。主要功能有:角色分为普通用户和管理员普通用......