当前位置: 首页 > news >正文

理解Go语言中上下文

        开发人员有时会误解context.Context类型,尽管它是Go语言的关键概念之一,也是Go中并发代码的基础之一。接下来让我们看看这个概念,并确保我们理解为什么乃如何有效地使用它。

根据官方文档:

        上下文(context)携带最后期限、取消信号和其他跨API边界的值。

        下面让我们来看下这个定义,以及和上下文相关的概念。

1. 最后期限

最后期限(deadline)是指通过以下方式明确指定的时间点:

  • 从当前开始的一个time.Duration
  • 一个time.Time

        最后期限的语义传达了如果到达此时间点则应停止当前的活动。例如,活动可以是一个I/O请求或者是一个等待从channel接收消息的goroutine。

        让我们考虑一个应用程序,它每4秒就从雷达那里接收一次飞行位置。一旦收到一个位置,我们希望能与其他关心最新位置的应用程序共享它。我们在我们所掌握的逻辑中定义了一个publisher接口,它只包含一个方法:

type publisher interface {Publish(ctx context.Context, position flight.Position) error
}

这个方法接收一个上下文参数和一个位置参数。我们假定这个具体的实现会调用一个函数来给代理(broker,就像使用Sarama库发布Kafka消息一样)发布消息。这个函数是上下文敏感的(context aware),也就是说,一旦上下文被取消,它就可以取消请求。

        假定我们没有收到上游的上下文,那应该提供给Publish方法什么上下文呢?我们提到过,应用程序只对最新的位置感兴趣,所以我们自已构建的上下文应该传达4秒超时的信息,如果4秒后还没有发布新的飞行位置,那就应该停止调用Publish方法:

type publishHandler struct {pub publisher
}func (h publishHandler) publishPosition(position flight.Position) error {ctx, cancel := context.WithTimeout(context.Background(), 4*time.Second)defer cancel()return h.pub.Publish(ctx, position)
}

这段代码使用context.WithTimeout函数创建了一个上下文对象,它接收一个超时参数和一个上下文参数,因为publishPosition没有接收一个已存在的上下文,所以我们使用cont

http://www.lryc.cn/news/339156.html

相关文章:

  • [MySQL]数据库原理8——喵喵期末不挂科
  • 【算法基础】插入排序与二分查找、升级二分查找
  • 在Vue3中如何使用H.265视频流媒体播放器EasyPlayer.js?
  • 基于51单片机的PM2.5监测系统设计—环境监测仪
  • 【C语言】指针篇-初识指针(1/5)
  • 【御控物联】物联网平台设备接入-JSON数据格式转化(场景案例四)
  • stack和queue模拟实现
  • docker操作
  • 分布式锁介绍
  • Unity 获取RenderTexture像素颜色值
  • Tomcat以服务方式启动,无法访问网络共享目录问题
  • SVN的介绍
  • ZYNQ-700呼吸灯
  • UE5学习日记——制作多语言版本游戏,同时初步学习UI制作、多语言化、控制器配置、独立进程测试、打包配置和快速批量翻译等
  • 电脑重启后word文档空白或打不开,word无法自动修复,如何拯救
  • MVC和MVVM这两种设计模式的区别
  • 淘宝app端商品详情数据采集(商品价格,商品库存,商品销量,商品优惠券)
  • 第42篇:随机存取存储器(RAM)模块<一>
  • 在Java中实现记录1000万用户连续7天登录的功能,可以使用Redis的Bitmap来跟踪每个用户的登录状态
  • 深入探讨VIVE OpenXR:为Unity开发者的全面指南
  • 【Altium Designer 20 笔记】PCB线宽与过孔尺寸
  • 基于java的社区生活超市管理系统
  • 51单片机入门_江协科技_27~28_OB记录的自学笔记_AT24C02数据存储秒表
  • LeetCode-热题100:169. 多数元素
  • 汽车维修类中译英的英语翻译
  • java中的List,ArrayList和LinkedList集合
  • RESTful API与Web应用程序构建:原理与实践
  • 输了,腾讯golang一面凉了
  • 如何通过代码签名证书加强安全防护?
  • Docker速成:新手变专家!