前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2014年7月29日 Go生态洞察:Go并发模式之Context

2014年7月29日 Go生态洞察:Go并发模式之Context

作者头像
猫头虎
发布2024-04-09 14:01:50
830
发布2024-04-09 14:01:50
举报
文章被收录于专栏:猫头虎博客专区

2014年7月29日 Go生态洞察:Go并发模式之Context 🌐

摘要

🐾 大家好,我是猫头虎博主!今天,我要和大家深入探讨Go的一个强大特性——Context。在Go的服务器中,每个传入请求都在它自己的goroutine中处理。Context使我们能够在API边界之间,轻松传递请求范围内的值、取消信号和截止日期。如果请求被取消或超时,所有处理该请求的goroutines都应该迅速退出,以便系统能够回收它们正在使用的资源。让我们一起深入了解Context,并通过一个完整的工作示例来学习如何使用它!🔍

引言

在Go服务器中,每个传入的请求都在自己的goroutine中处理。这些请求处理程序经常启动额外的goroutines来访问后端数据库和RPC服务。处理请求的goroutine集通常需要访问特定于请求的值,例如终端用户的身份、授权令牌和请求的截止时间。当请求被取消或超时时,所有处理该请求的goroutines都应该迅速退出。

正文

Context的核心 🎯

Context类型是context包的核心。它携带截止日期、取消信号和跨API边界的请求范围值。其方法可被多个goroutines安全使用。Done方法返回一个通道,当Context被取消或超时时关闭,Err方法返回一个错误,指示为什么Context被取消。

代码语言:javascript
复制
type Context interface {
    Done() <-chan struct{}
    Err() error
    Deadline() (deadline time.Time, ok bool)
    Value(key interface{}) interface{}
}
派生Contexts 🌱

context包提供了从现有Contexts派生新Contexts的功能。这些值形成一棵树:当一个Context被取消时,从它派生的所有Contexts也被取消。

示例:谷歌网络搜索 🔍

我们的示例是一个HTTP服务器,它处理像/search?q=golang&timeout=1s这样的URL,通过将查询“golang”转发到谷歌网络搜索API并呈现结果。timeout参数告诉服务器在该时间段后取消请求。

代码分布在三个包中:

  • server提供了main函数和处理/search的处理器。
  • userip提供了从请求中提取用户IP地址并将其与Context关联的函数。
  • google提供了向谷歌发送查询的Search函数。
服务器程序 🌐

服务器程序处理像/search?q=golang这样的请求,通过呈现golang的前几个谷歌搜索结果。它注册handleSearch来处理/search端点。处理器创建一个名为ctx的初始Context,并安排在处理器返回时取消它。

userip包 🌍

userip包提供了从http.Request中提取用户IP地址并将其与Context关联的函数。它通过提供HTTP请求到键值对的映射来使处理程序能够将数据与传入请求关联。

google包 🔎

google.Search函数向谷歌网络搜索API发出HTTP请求,并解析JSON编码的结果。它接受一个Context参数ctx,并在请求进行中如果ctx.Done被关闭则立即返回。

适配代码以使用Contexts

许多服务器框架

提供用于携带请求范围值的包和类型。我们可以定义新的Context接口实现,以便在使用现有框架的代码和期望Context参数的代码之间架起桥梁。

结论

在谷歌,我们要求Go程序员将Context参数作为从传入到传出请求之间的调用路径上每个函数的第一个参数。这使得由许多不同团队开发的Go代码能够很好地互操作。它为超时和取消提供了简单的控制,并确保像安全凭证这样的关键值能够正确地通过Go程序传递。

参考资料

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2014年7月29日 Go生态洞察:Go并发模式之Context 🌐
    • 摘要
      • 引言
        • 正文
          • Context的核心 🎯
          • 派生Contexts 🌱
          • 示例:谷歌网络搜索 🔍
        • 适配代码以使用Contexts
          • 结论
            • 参考资料
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档