iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Golang中Context的常见应用场景有哪些
  • 472
分享到

Golang中Context的常见应用场景有哪些

2023-07-04 22:07:51 472人浏览 安东尼
摘要

这篇文章主要讲解了“golang中Context的常见应用场景有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang中Context的常见应用场景有哪些”吧!超时取消假设我们希望H

这篇文章主要讲解了“golang中Context的常见应用场景有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang中Context的常见应用场景有哪些”吧!

超时取消

假设我们希望Http请求在给定时间内完成,超时自动取消。

首先定义超时上下文,设定时间返回取消函数(一旦超时用于清理资源)。调用取消函数取消后续操作,删除子上下文对父的引用。

    ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*80)    defer cancel()    req = req.WithContext(ctx)

还可以通过特定时间进行设定:

/ The context will be cancelled after 3 seconds// If it needs to be cancelled earlier, the `cancel` function can// be used, like beforectx, cancel := context.WithTimeout(ctx, 3*time.Second)// Setting a context deadline is similar to setting a timeout, except// you specify a time when you want the context to cancel, rather than a duration.// Here, the context will be cancelled on 2022-11-10 23:00:00ctx, cancel := context.WithDeadline(ctx, time.Date(2022, time.November, 10, 23, 0, 0, 0, time.UTC))

完整实例如下:

func main() {    //定义请求req, err := http.NewRequest(http.MethodGet, "https://www.baidu.com", nil)if err != nil {log.Fatal(err)}    // 定义上下文ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*80)defer cancel()req = req.WithContext(ctx)    // 执行请求c := &http.Client{}res, err := c.Do(req)if err != nil {log.Fatal(err)}defer res.Body.Close()    // 输出日志out, err := io.ReadAll(res.Body)if err != nil {log.Fatal(err)}log.Println(string(out))}

超时输出结果:

2022/12/27 14:36:00 Get "https://www.baidu.com": context deadline exceeded

我们可以调大超时时间,则能正常看到输出结果。

取消后续操作

有时请求被取消后,需要阻止系统继续做后续比必要的工作。请看下面用户发起的http请求,应用程序接收请求后查询数据库并返回查询结果:

正常流程如下:

Golang中Context的常见应用场景有哪些

但如果客户端取消了请求,如果没有取消,应用服务和数据库仍然继续工作,然后结果却不能反馈给客户端。理想状况为所有下游过程停止,如图所示:

Golang中Context的常见应用场景有哪些

考虑有两个相关操作的情况,“相关”的意思是如果一个失败了,另一个即使完成也没有意义了。如果已经知道前一个操作失败了,则希望取消所有相关的操作。请看示例:

func operation1(ctx context.Context) error {// 假设该操作因某种原因而失败// 下面模拟业务执行一定时间time.Sleep(100 * time.Millisecond)return errors.New("failed")}func operation2(ctx context.Context) {// 该方法要么正常执行完成// 要么取消,不再继续执行select {case <-time.After(500 * time.Millisecond):fmt.Println("done")case <-ctx.Done():fmt.Println("halted operation2")}}func main() {// 创建上下文ctx := context.Background()// 基于上下文创建需求上下文ctx, cancel := context.WithCancel(ctx)// 在不同协程中执行两个操作go func() {err := operation1(ctx)// 如果该方法返回错误,则取消该上下文中的后续操作if err != nil {cancel()}}()// 实用相同上下文执行操作2operation2(ctx)}

由于我们设置操作2执行时间较长,而操作1很快就报错,因此输出结果为操作2被取消:

halted operation2

上下文传值

我们可以实用上下文变量在不同协程中传递值。

Golang中Context的常见应用场景有哪些

假设一个操作需要调用函数多次,其中用于标识的公共ID需要被 日志记录,请看示例:

// 定义key,用于保存上下文值的键const keyID = "id"func main() {    // 定义上下文值rand.Seed(time.Now().Unix())ctx := context.WithValue(context.Background(), keyID, rand.Int())operation1(ctx)}func operation1(ctx context.Context) {// do some work// we can get the value from the context by passing in the keylog.Println("operation1 for id:", ctx.Value(keyID), " completed")operation2(ctx)}func operation2(ctx context.Context) {// do some work// this way, the same ID is passed from one function call to the nextlog.Println("operation2 for id:", ctx.Value(keyID), " completed")}

这里在main函数中创建上下文,并采用键值对方式存储id值,从而后续函数调用时可以从上下文中获取该值。如图所示:

使用context变量在不同操作中传递信息非常有用,主要原因包括:

  • 线程安全: 一旦设置了上下文键,就不能修改它的值,可以使用context.WithValue方法可以设置新的值

  • 通用方法: 在Go的官方库和应用程序中大量使用上下文传递数据,我们当然最好也使用这种模式

感谢各位的阅读,以上就是“Golang中Context的常见应用场景有哪些”的内容了,经过本文的学习后,相信大家对Golang中Context的常见应用场景有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

您可能感兴趣的文档:

--结束END--

本文标题: Golang中Context的常见应用场景有哪些

本文链接: https://www.lsjlt.com/news/347685.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Golang中Context的常见应用场景有哪些
    这篇文章主要讲解了“Golang中Context的常见应用场景有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang中Context的常见应用场景有哪些”吧!超时取消假设我们希望H...
    99+
    2023-07-04
  • 详解Golang中Context的三个常见应用场景
    目录超时取消取消后续操作上下文传值超时取消 假设我们希望HTTP请求在给定时间内完成,超时自动取消。 首先定义超时上下文,设定时间返回取消函数(一旦超时用于清理资源)。调用取消函数取...
    99+
    2022-12-29
    Golang Context应用场景 Golang Context应用 Golang Context
  • Golang上下文Context的常见应用场景
    目录Context类型emptyCtxcancelCtxcanceler接口timerCtxvalueCtx函数默认上下文Background()TODO()取消信号WithCanc...
    99+
    2023-05-16
    Golang Context应用场景 Golang Context上下文 Golang Context
  • Ajax常见应用场景有哪些
    这篇文章将为大家详细讲解有关Ajax常见应用场景有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1 什么是AJAXAJAX(Asynchronous JavaScri...
    99+
    2024-04-02
  • Golang上下文Context的常见应用场景是什么
    这篇文章主要介绍了Golang上下文Context的常见应用场景是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Golang上下文Context的常见应用场景是什么文章都会有所收获,下面我们一起来看看吧。C...
    99+
    2023-07-06
  • Golang常见的应用场景在软件开发中有哪些?
    Golang作为一种开发语言,具有简洁高效、并发性能强等特点,因而在软件开发中有着广泛的应用场景。下面将介绍一些常见的应用场景。网络编程Golang在网络编程方面表现出色,特别适合构建高并发、高性能的服务器。它提供了丰富的网络库,开发人员可...
    99+
    2023-12-28
    云计算 web开发 分布式系统
  • Go语言常见的应用场景有哪些?
    go语言适用于多种场景,包括后端开发、微服务架构、云计算、大数据处理、机器学习,以及构建restful api。其中,使用go构建restful api的简单步骤包括:设置路由器、定义处...
    99+
    2024-04-03
    应用场景 go语言
  • 云主机的常见应用场景有哪些
    云主机的应用场景有:1.企业官网;2.高并发应用或网站;3.高I/O要求数据库;4.访问量波动剧烈的网站;具体分析如下:企业官网网站初始阶段访问量小,可以选择配置的云主机,随着网站发展,可以随时升级云主机配置,或者增加云主机实例数量,无需担...
    99+
    2024-04-02
  • 数组在Java中有哪些常见的应用场景?
    Java是一门广泛应用的编程语言,它有着丰富的数据结构,其中数组是最基础也是最常用的数据结构之一。数组是一种容器,它能够存储多个相同类型的元素,这些元素在内存中是连续存储的。本文将介绍在Java中数组的常见应用场景以及相关的代码实现。 1....
    99+
    2023-07-20
    unix 自然语言处理 数组
  • golang应用场景有哪些
    golang应用场景有网络编程、分布式系统、微服务、大数据处理、Web开发、云计算和容器化、物联网等等。详细介绍:1、网络编程,Golang具有内置的网络编程库,可以方便地构建高性能的网络应用程序;2、分布式系统,Golang天生支持并发和...
    99+
    2023-12-14
    Golang
  • GIT在GO语言中有哪些常见的应用场景?
    GIT是目前广泛应用于版本控制的工具之一,而GO语言则是近年来备受关注的编程语言之一。两者在实际应用中有着紧密的联系,GIT在GO语言中的应用场景也是非常广泛的,本文将对此进行探讨。 一、代码管理 GIT最基础的应用场景就是代码管理,GO语...
    99+
    2023-07-03
    数据类型 框架 git
  • golang闭包的应用场景有哪些
    Golang闭包的应用场景包括:1. 函数工厂:闭包可以创建并返回一个函数,这个函数在被调用时可以访问其父函数的局部变量。这种用法常...
    99+
    2023-09-27
    golang
  • Python中的容器和数组有哪些常见的应用场景?
    Python是一种强大的编程语言,它支持各种类型的数据结构,如容器和数组。这些数据结构在Python中的应用非常广泛,因为它们可以使代码更加模块化和易于维护。在本文中,我们将探讨Python中的容器和数组的常见应用场景,以及如何在代码中使用...
    99+
    2023-06-13
    关键字 容器 数组
  • 代理IP常见的使用场景有哪些
    本篇内容主要讲解“代理IP常见的使用场景有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“代理IP常见的使用场景有哪些”吧!根据隐蔽性,ip代理服务现在可以分为三类。由于价格相对低廉,一般代理...
    99+
    2023-06-20
  • IDE 文件中的 ASP 重定向:有哪些常见的应用场景?
    ASP(Active Server Pages)是一种用于创建动态网页的服务器端脚本语言。在 ASP 中,重定向是一种非常常见的技术,用于将用户的请求重定向到另一个 URL 上。在本文中,我们将讨论 ASP 文件中的重定向,以及它在哪些常...
    99+
    2023-10-30
    重定向 ide 文件
  • Python中的数组容器对象有哪些常见的应用场景?
    Python是一种高级编程语言,它提供了多种容器对象来存储数据。其中,数组容器对象是一种非常常见的数据结构。在Python中,数组容器对象有哪些常见的应用场景呢?让我们一起来探讨一下。 数值计算 在数值计算中,数组容器对象是必不可少的...
    99+
    2023-08-20
    数组 容器 对象
  • 大数据处理中的函数有哪些常见的应用场景?
    大数据处理是当今互联网时代的一个热门话题,越来越多的企业和组织开始使用大数据技术来处理海量的数据。而在大数据处理中,函数是一个非常重要的部分。下面我们将介绍一些大数据处理中常见的函数及其应用场景。 一、Map函数 Map函数是大数据处理中最...
    99+
    2023-09-22
    大数据 shell 函数
  • Golang中单例模式的应用场景有哪些?
    Golang是一种开源的静态类型编程语言,具有高效、强大和简洁的特点。在Golang中,单例模式是一种常用的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。单例模式在很多场...
    99+
    2024-03-05
    场景 单例模式 golang应用
  • Hadoop MapReduce常见的容错场景有哪些
    这篇文章主要介绍“Hadoop MapReduce常见的容错场景有哪些”,在日常操作中,相信很多人在Hadoop MapReduce常见的容错场景有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操...
    99+
    2024-04-02
  • Redis在PHP中的常见应用场景
    Redis是一种基于内存的键值存储数据库,它具有高性能、高可用性、高可扩展性等优点,被广泛应用于各个领域的数据存储和缓存优化。在PHP应用场景中,Redis也有着广泛的应用,本文主要介绍Redis在PHP中常见的应用场景。缓存优化缓存优化是...
    99+
    2023-05-15
    应用场景 PHP redis
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作