返回顶部
首页 > 资讯 > 后端开发 > GO >go语言心跳超时的实现示例
  • 690
分享到

go语言心跳超时的实现示例

2024-04-02 19:04:59 690人浏览 泡泡鱼
摘要

目录一、背景二、心跳超时的实现2.1 通过select case (设计概念比较多)2.2 通过time.sleep(简单有效)三、个人的实现观感一、背景 本文描述的是客户端接收心跳

一、背景

本文描述的是客户端接收心跳信息的超时实现。心跳超时,或者接受信息超过限定时间在分布式系统中出现的次数比较多。常见的就有hadoop中节点超时,或者日志中出现timeout的字样。

学习Go语言中,我也根据go语言的机制实现了心跳超时的这个问题。踩过坑,趟过水。

二、心跳超时的实现

2.1 通过select case (设计概念比较多)

这种方法实现心跳,需要对go语言中的channel和select case 机制有所了解。select代码段中没有包含default条件时,会一直阻塞到有通道操作。

需要注意的是!!!! select语言只会阻塞一次,且执行一次。如果需要多次判断,或者可能有多个case条件需要满足,那就需要增加for语句。

首先需要知道的是select是专为channel设计的,所以说每个case表达式都必须是包含操作通道的表达式。下面这段代码是描述了随机抽取一个channel发消息,正常情况下,不会触发超时。为了触发超时,注释掉通道发送数据操作。超时五秒,则触发超时。

package main
 
import (
    "fmt"
    "math/rand"
    "time"
)
 
func main() {
    // 准备好三个通道。
    intChannels := [3]chan int{
        make(chan int, 1),
        make(chan int, 1),
        make(chan int, 1),
    }
    // 随机选择一个通道,并向它发送元素值。
    index := rand.Intn(3)
    fmt.Printf("The index: %d\n", index)
 
    //‼️ 取消这行代码的注视,超时条件的选择就会触发。
    //intChannels[index] <- index
    // 哪一个通道中有可取的元素值,哪个对应的分支就会被执行。
    select {
    case <-intChannels[0]:
        fmt.Println("The first candidate case is selected.")
    case <-intChannels[1]:
        fmt.Println("The second candidate case is selected.")
    case elem := <-intChannels[2]:
        fmt.Printf("The third candidate case is selected, the element is %d.\n", elem)
    case <-time.After(5 * time.Second):
        fmt.Println("timed out")
    }
}

2.2 通过time.sleep(简单有效)

通过time.sleep()实现超时操作,是比较巧妙的。一般来说心跳超时是一个双方交互的行为。

下面画一个图来描述一下。

 为了方便理解,定义双方都使用共同时间。

下面是代码。

基本的逻辑是:

        1、先给客户端设置一个下次超时的时间

         2、客户端每次收到心跳的时候,更新这个时间

         3、开启一个独立的线程,一致判断当前客户端是否超时。

ps:结合时效和性能,可以间隔一定的时间来进行判断。

package main
 
import (
    "fmt"
    "sync"
    "time"
)
 
type Client struct {
    lock sync.Mutex //加
    nextTimeOutTime time.Time //下次超时时间
}
 
const tenSec = 10

func (client *Client) freshTimeOutTime()  {
    client.lock.Lock()
    defer client.lock.Unlock()
    client.nextTimeOutTime =time.Now().Add(tenSec*time.Second)
}
 
//开启一个gp,每隔500ms判断有没有超时
func (client *Client) judgeTimeOut()  {
    for  {
        time.Sleep(500*time.Millisecond)
        fmt.Printf("%v 在判断是否超时\n", client.nextTimeOutTime)
        if time.Now().After(client.nextTimeOutTime) {
            fmt.Printf("%v 超时了\n", client.nextTimeOutTime)
        }
    }
}
 
//客户端收到以后,修改下次心跳超时时间
func (client *Client) receiveHeart()  {
    client.freshTimeOutTime()
}
 
//开启一个模拟ping 客户端的线程
func pinGClient(client *Client)  {
    for true {
        time.Sleep(11*time.Second)
        fmt.Printf("%v 请求发送时间\n", time.Now())
        client.receiveHeart()
    }
 
}
 
func main() {
    client := Client{
        lock:            sync.Mutex{},
        nextTimeOutTime: time.Time{},
    }
    //在当前时刻,更新下次的超时时刻是10s中后
    client.freshTimeOutTime()
 
 
    go pingClient(&client)
 
 
    go client.judgeTimeOut()
 
    for true {
 
    }
}

三、个人的实现观感

使用select case 和 time.sleep实现超时的最大区别在于,time.sleep没有太多的?语言相关的语法和知识,更容易理解和掌握。相对于channel来说,掌握需要了解channel的基本使用方法,一些常见的特性等。

到此这篇关于go语言心跳超时的实现示例的文章就介绍到这了,更多相关go语言心跳超时内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: go语言心跳超时的实现示例

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

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

猜你喜欢
  • go语言心跳超时的实现示例
    目录一、背景二、心跳超时的实现2.1 通过select case (设计概念比较多)2.2 通过time.sleep(简单有效)三、个人的实现观感一、背景 本文描述的是客户端接收心跳...
    99+
    2024-04-02
  • go语言心跳超时怎么实现
    这篇文章主要介绍了go语言心跳超时怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go语言心跳超时怎么实现文章都会有所收获,下面我们一起来看看吧。一、背景本文描述的是客户端接收心跳信息的超时实现。心跳超时...
    99+
    2023-06-30
  • Go语言实现超时的三种方法实例
    目录前言方法一:用两个通道 + A协程sleep方法二:使用Timer(定时器)方法三:使用context.WithTimeout附:go 实现超时退出总结前言 超时,指一个协程A开...
    99+
    2024-04-02
  • 如何使用Go语言实现Websocket心跳检测
    如何使用Go语言实现Websocket心跳检测Websocket是一种在Web应用中实现双向通信的协议,它能够允许服务器主动向客户端推送数据。在一些实时性要求高的应用中,我们可能需要实时监测客户端的状态,确保连接的稳定性。为了实现这个目标,...
    99+
    2023-12-14
    Go语言 websocket 心跳检测
  • go语言操作es的实现示例
    目录Elasticsearch介绍Elasticsearch能做什么go语言操作es解决golang使用elastic连接elasticsearch时自动转换连接地址初始化数据创建查...
    99+
    2024-04-02
  • Go语言实现枚举的示例代码
    在编程领域里,枚举用来表示只包含有限数量的固定值的类型,在开发中一般用于标识错误码或者状态机。拿一个实体对象的状态机来说,它通常与这个对象在数据库里对应记录的标识状态的字段值相对应。...
    99+
    2024-04-02
  • GO实现跳跃表的示例详解
    目录跳跃表介绍跳跃表的实现跳跃表的结构创建跳跃表跳跃表的插入和删除跳跃表的排名操作跳跃表的区间操作完整实现跳跃表介绍 跳跃表(skiplist)是一种有序的数据结构,它通过建立多层&...
    99+
    2022-12-19
    GoLang跳跃表 GO跳跃表
  • Go语言实现请求超时处理的方法总结
    目录1. 简介2. 问题引入3. timer的实现方案3.1 timer的基本介绍3.2 timer实现超时控制3.3 对问题的解决4.timetCtx的实现方案4.1 timerC...
    99+
    2023-05-18
    Go语言请求超时处理方法 Go语言 超时处理方法 Go语言 超时处理
  • go语言实现全排列的示例代码
    目录思路:回溯过程:代码:思路: 首先画出全排列的树形结构,以123为例,一开始排列为空列表,第一个位置有三种可能,分别是1、2、3,画出三个分支;由于第一个位置已经被占用,那么第二...
    99+
    2023-03-07
    go语言全排列
  • Qt超时锁屏的实现示例
    概述 Qt实现超时锁屏的功能(工控机触摸屏),当手长时间不触摸屏幕的时候,程序超时会显示锁屏窗口。 效果 主窗口超时显示锁屏窗口: 系统窗口超时显示锁屏窗口: 实现思路 首先开...
    99+
    2024-04-02
  • Go语言中io包核心接口示例详解
    目录前言ReaderWriterCloserSeeker组合接口总结前言 IO 操作是我们在编程中不可避免会遇到的,例如读写文件,Go语言的 io 包中提供了相关的接口,定义了...
    99+
    2022-06-07
    io GO 示例 go语言 接口
  • GO语言实现文件上传的示例代码
    目录前言文件上传表单操作服务端操作流程实现小结前言 最近在写一个文件上传的功能,现在来进行整理总结一下go语言如何上传文件的,本文主要分享一下golang实现文件上传的流程和具体代码...
    99+
    2024-04-02
  • go语言实现屏幕截图的示例代码
    目录借助第三方库安装自定义截图 Capture全屏截图 CaptureDisplay获取活动显示器数量 NumActiveDisplays获取指定屏幕显示范围 GetDisplayB...
    99+
    2024-04-02
  • go语言中如何使用select的实现示例
    目录1.基本语法2.select语句的实际应用在golang语言中,select语句 就是用来监听和channel有关的IO操作,当IO操作发生时,触发相应的case动作。...
    99+
    2024-04-02
  • Go语言实现Sm2加解密的示例代码
    在 Go 语言中,可以使用 github.com/tjfoc/gmsm/sm2 包来实现 SM2 加密和解密。 示例代码如下: package main import (     ...
    99+
    2023-03-19
    Go Sm2加解密 Go Sm2
  • GO语言实现TCP服务器的示例代码
    interface/tcp/Handler.go type Handler interface { Handle(ctx context.Context, conn net.C...
    99+
    2023-03-24
    GO编写TCP服务器 GO TCP服务器 GO TCP
  • GO语言中Chan实现原理的示例详解
    目录GO 中 Chan 实现原理分享chan 是什么GO 中 Chan 的底层数据结构咱们来画个图看看dataqsiz 对应的环形队列是啥样的写 sendq和 读 recvq 等待队...
    99+
    2023-02-24
    GO语言Chan实现原理 GO语言Chan原理 GO语言Chan
  • GO语言中defer实现原理的示例详解
    目录GO 中 defer的实现原理defer 是什么defer 实现原理GO 中 defer 的规则第一点咱们来写个小DEMO第三点也来一个DEMO总结GO 中 defer的实现原理...
    99+
    2023-02-24
    GO语言defer实现原理 GO语言defer原理 GO defer
  • Go语言实现彩色输出示例详解
    目录简介说明支持Linux彩色输出支持Windows彩色输出Golang IDE输出是不支持的使用CODE DEMO小结简介 在逛github时发现一个好玩的Go项目,彩色输出文本 ...
    99+
    2024-04-02
  • Go语言中怎么实现代码跳转
    这篇文章主要讲解了“Go语言中怎么实现代码跳转”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言中怎么实现代码跳转”吧!一、基本概念在Go语言中,代码跳转是指从一个位置跳转到另一个位置。...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作