返回顶部
首页 > 资讯 > 精选 >如何在 Go 中使用超时和重试来创建上下文?
  • 291
分享到

如何在 Go 中使用超时和重试来创建上下文?

go语言 2024-02-09 05:02:27 291人浏览 薄情痞子
摘要

PHP小编新一将为大家介绍如何在Go语言中使用超时和重试来创建上下文。在编写代码时,我们经常会遇到需要限制某个操作的执行时间或者在操作失败时进行重试的情况。Go语言提供了一种简洁而强大

PHP小编新一将为大家介绍如何在Go语言中使用超时和重试来创建上下文。在编写代码时,我们经常会遇到需要限制某个操作的执行时间或者在操作失败时进行重试的情况。Go语言提供了一种简洁而强大的机制,即上下文(context),它可以帮助我们实现这些需求。通过合理地利用超时和重试机制,我们可以提高代码的可靠性和稳定性,同时提升用户体验。在接下来的文章中,我们将详细讨论如何在Go语言中使用超时和重试来创建上下文。

问题内容

我尝试在 go 中使用超时和多次重试来创建上下文。 这是代码示例

func readretry(port io.readwritecloser, timeout, cnt int) []byte {
    fmt.println("in read retry")
    for i := 0; i < cnt; i++ {
        fmt.println("read attempt:", i)
        res := readwithcontext(timeout, port)
        if res != nil {
            return res
        }
    }
    return nil
}

func readwithcontext(timeout int, port io.readwritecloser) []byte {
    fmt.println("in readwithcontext")
    fmt.println("opening channel")
    rcvch := make(chan []byte)
    ctx, cancel := context.withtimeout(context.background(), time.duration(time.second*time.duration(timeout)))
    defer cancel()

    go reader(ctx, port, rcvch)

    for {
        select {
        case <-ctx.done():
            fmt.println("reader: context cancelled")
            return nil
        case buf := <-rcvch:
            fmt.println("reader: got data")
            return buf
        }
    }
}

func reader(ctx context.context, port io.readwritecloser, rcvch chan []byte) {

    fmt.println("in reader")

    answ := make([]byte, 1024)
    buf := bytes.buffer{}
    var err error

    for {
        i := 0
        i, err = port.read(answ)
        if err != nil && err != io.eof {
            log.printf("port.read: %v", err)
        }
        if i != 0 {
            answ = answ[:i]
            buf.write(answ)
            if buf.bytes()[len(buf.bytes())-1] == delimiter {
                fmt.print("received: ")
                printbuf(buf.bytes())
                rcvch <- buf.bytes() //if there is no data in the first attempt, cannot write to the channel here!!
                return
            }
        }
    }
}

然后,我调用 readretry result := readretry(port, 2, 5) // 2 秒超时,5 次重试。但如果第一次数据没有准备好,那么 reader 无法写入 rcvch 。可能已经满了?为什么?如果我尝试在 readwithcontext 执行结束时关闭通道,则会发生冲突 - 写入已关闭的通道。碰撞在哪里?它认为,readwithcontext每次都会作为一个新实例启动,创建一个rcvch的新实例,如果reader因超时而关闭,则所有链函数及其局部变量(包括通道)已被破坏。但是,看来我犯了一个错误。那么,如何进行重试呢? 看看日志是什么样子的:

IN READ RETRY
Read attempt: 1
IN readWithContext
Opening channel
IN reader
Start reader
Received: 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0d //<- data is received, but not written to the channel!!
reader: context cancelled

解决方法

每次重试都会创建一个新的阅读器和一个新的频道。如果 readWithContext 超时,读者仍然在那里等待,并且可能最终阅读,但现在通道的另一端没有人在监听,因此读者被泄露。

有一个 reader goroutine 和一个通道,使用 readWithContext 从中读取。如果上下文过期并且所有重试都用尽,您也必须停止读取器。

以上就是如何在 Go 中使用超时和重试来创建上下文?的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 如何在 Go 中使用超时和重试来创建上下文?

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

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

猜你喜欢
  • 如何在 Go 中使用超时和重试来创建上下文?
    php小编新一将为大家介绍如何在Go语言中使用超时和重试来创建上下文。在编写代码时,我们经常会遇到需要限制某个操作的执行时间或者在操作失败时进行重试的情况。Go语言提供了一种简洁而强大...
    99+
    2024-02-09
    go语言
  • 如何在 Linux 上使用 Go 语言创建对象?
    Linux 是一款广受欢迎的操作系统,因为它具有强大的安全性和灵活性。而 Go 语言则是一种由 Google 开发的编程语言,它的高效性和易用性被广泛认可。在本文中,我们将探讨如何在 Linux 上使用 Go 语言创建对象。 在 Go 语言...
    99+
    2023-11-07
    对象 http linux
  • Golang 文件上传中如何使用 context 超时?
    go 中文件上传使用 context 超时可以防止服务器长时间等待客户端完成上传。方法包括:1)创建一个新的 context 对象,设置超时值;2)将 context 对象传递给文件操作...
    99+
    2024-05-13
    超时 context golang
  • 如何在SQLServer中创建和使用临时表变量
    在SQL Server中,可以使用DECLARE关键字来创建临时表变量,并使用SELECT INTO语句或INSERT IN...
    99+
    2024-04-02
  • 如何在 Go 和 JavaScript 中使用重定向来提高性能?
    重定向是一种常用的技术,可以将用户从一个 URL 导航到另一个 URL。这在网络应用程序中非常常见,例如重定向到登录页面或重定向到另一个网站。在本文中,我们将探讨如何在 Go 和 JavaScript 中使用重定向来提高性能。 什么是重定向...
    99+
    2023-06-17
    javascript shell 重定向
  • 如何在 VSCode 中为特定 .go 文件创建调试配置?
    在使用 VSCode 进行 Go 语言开发时,我们经常需要进行调试以解决问题。然而,对于特定的 .go 文件,我们可能需要创建自定义的调试配置。那么,如何在 VSCode 中为特定 ....
    99+
    2024-02-10
  • 如何在 google cloud run for firebase 中创建上下文对象
    积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《如何在 google cloud ...
    99+
    2024-04-05
  • Oracle中如何创建和使用临时表
    这篇文章将为大家详细讲解有关Oracle中如何创建和使用临时表,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。ORACLE数据库除了可以保存永久表外,还可以建...
    99+
    2024-04-02
  • 如何在Go中使用对象和函数来构建框架?
    Go 是一种非常流行的编程语言,其简洁、高效的特性让它在 Web 开发、云计算、网络编程等方面得到广泛应用。在使用 Go 编写应用程序时,构建框架是一个非常重要的环节。本文将介绍如何在 Go 中使用对象和函数来构建框架,让你的应用程序更加灵...
    99+
    2023-11-02
    对象 函数 框架
  • 如何在Python中使用NumPy来创建Unix脚本?
    Python是一种功能强大的编程语言,它拥有许多优秀的库和工具来提高开发者的效率。其中,NumPy是一个非常重要的库,它提供了许多高级的数学和科学计算功能,使得开发者可以更加轻松地进行数据分析和处理。同时,NumPy也可以用来创建Unix...
    99+
    2023-06-16
    numy shell unix
  • 如何在PHP中使用Spring容器来创建和管理数组?
    PHP是一种常见的编程语言,而Spring容器则是一个流行的Java应用程序框架。虽然二者看起来不太相关,但是在PHP中使用Spring容器可以大大简化代码编写和管理,特别是在处理数组时。下面我们将介绍如何在PHP中使用Spring容器来创...
    99+
    2023-06-19
    spring 数组 容器
  • 你知道如何使用 Go 和 Django 创建实时 shell 吗?
    当你想要在 Web 应用程序中添加实时 shell 功能时,Go 和 Django 是两个非常好的选择。Go 是一门高效、快速、可靠的语言,而 Django 是一个流行的 Python Web 框架,提供了一系列的工具和库,使得 Web 开...
    99+
    2023-07-08
    django 实时 shell
  • 如何在 Windows 上使用 Go 和 JavaScript 进行重定向?
    在 Windows 上使用 Go 和 JavaScript 进行重定向是一种常见的技术,尤其是在网络开发中。在本文中,我们将介绍如何在 Windows 上使用 Go 和 JavaScript 进行重定向,并提供相关的演示代码。 一、什么是重...
    99+
    2023-08-23
    javascript 重定向 windows
  • 如何使用 Go 语言和 JavaScript 创建实时应用程序?
    实时应用程序是当今互联网领域中最热门的技术之一。实时应用程序可以让用户在不需要刷新页面的情况下获取最新的数据,并立即响应用户的操作。这种应用程序通常用于聊天应用、实时协作和多人在线游戏等场景中。在本文中,我们将介绍如何使用 Go 语言和 ...
    99+
    2023-09-08
    实时 教程 javascript
  • 如何在 Python 中使用重定向来测试 leetcode 函数?
    Python 是一个流行的编程语言,也是在 LeetCode 上最常用的语言之一。在 LeetCode 上提交代码时,我们需要确保代码能够成功通过测试用例,而这需要我们进行一些测试。在本文中,我们将介绍如何使用 Python 中的重定向来测...
    99+
    2023-06-30
    重定向 leetcode 函数
  • 在Go语言中,使用哪些关键字来创建和管理数组?
    在Go语言中,数组是一种非常常见的数据类型,它可以用于存储一组同类型的数据。在Go语言中,使用关键字来创建和管理数组非常容易,下面让我们来一起看看。 创建数组 在Go语言中,创建数组的关键字是var,语法如下: var 数组名 [数组长...
    99+
    2023-09-23
    关键字 存储 数组
  • 如何在 Laravel 中使用重定向来跟踪 Go 对象?
    Laravel 是一个流行的 PHP 框架,它提供了许多有用的功能来简化 Web 应用程序的开发。其中之一是重定向。重定向是将用户从一个 URL 重定向到另一个 URL 的过程。在本文中,我们将探讨如何在 Laravel 中使用重定向来跟踪...
    99+
    2023-08-08
    对象 重定向 laravel
  • jQuery如何在创建元素时使用对象来定义属性
    这篇文章主要为大家展示了“jQuery如何在创建元素时使用对象来定义属性”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jQuery如何在创建元素时使用对象来定义属性”这篇文章吧。创建元素时使用对...
    99+
    2023-06-27
  • 如何使用Go和Django创建可靠的接口文件?
    Go和Django是两种非常流行的编程语言,它们都有着各自独特的优点。在本文中,我们将探讨如何使用这两种语言来创建可靠的接口文件。 一、Go语言 Go语言是由谷歌公司开发的一种开源编程语言,它具有以下特点: 简单易学:Go语言的语法非常...
    99+
    2023-08-25
    django 接口 文件
  • 如何使用Go函数在存储中创建索引?
    在现代软件开发中,存储是一个非常重要的组件。存储通常是应用程序的瓶颈之一,因此优化存储是非常重要的。在处理大量数据时,创建索引是一个重要的优化策略。在本文中,我们将探讨如何使用Go函数在存储中创建索引。 为什么需要索引? 在存储中创建索引的...
    99+
    2023-07-05
    函数 存储 索引
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作