go里面关于超时的设计
设想一下你在接收源源不断的数据,如果有700ms没有收到,则认为是一个超时,需要做出处理。
逻辑上可以设计一个grouting,里面放一个通道,每收到一条数据进行相应处理。通道中夹杂一个timer定时器的处理,若通道在700ms内有数据,则定时器被重置,重新等待700ms再调用定时器处理函数,否则,700ms时间到,运行定时器处理函数。示例代码如下:
package mainimport ("fmt""runtime/debug""strings""time"
)type demoSaveSuite struct {chanDemoSave chan string
}const dbSaveWaitDuration = 700 * time.Millisecondfunc (s *demoSaveSuite) DemoHandler() {go func() {defer func() {if r := recover(); r != nil {fmt.Println(string(debug.Stack()))}}()var timer *time.Timerfor sqlEntity := range s.chanDemoSave {fmt.Printf("Received SQL entity: %s\n", sqlEntity)// 检查 sqlEntity 是否包含 "SQL_Entity_5"if strings.Contains(sqlEntity, "SQL_Entity_5") {if timer != nil {timer.Stop()timer = nil // 将 timer 设为 nil 以确保不再使用它continue // 跳过本次循环的后续部分}}if timer == nil {timer = time.AfterFunc(dbSaveWaitDuration, func() {fmt.Printf("Executing action after delay for entity: %s\n", sqlEntity)})} else {timer.Reset(dbSaveWaitDuration)}}}()
}func main() {// You can place your main code here if neededsuite := &demoSaveSuite{chanDemoSave: make(chan string, 5), // Buffer to avoid blocking when sending messages}go suite.DemoHandler()// Send the first SQL entitysuite.chanDemoSave <- "SQL_Entity_1_300Millisecond"time.Sleep(300 * time.Millisecond) // sleep a bit, but not enough for dbSaveWaitDuration// Send the second SQL entitysuite.chanDemoSave <- "SQL_Entity_2_800Millisecond"time.Sleep(800 * time.Millisecond) // let the timer expire for SQL_Entity_1// Send the third SQL entity to test resetting the timersuite.chanDemoSave <- "SQL_Entity_3_300Millisecond"time.Sleep(300 * time.Millisecond) // sleep a bit, but not enough for dbSaveWaitDuration// Send the fourth SQL entitysuite.chanDemoSave <- "SQL_Entity_4_800Millisecond"time.Sleep(800 * time.Millisecond) // let the timer expire for SQL_Entity_3// Send the fourth SQL entitysuite.chanDemoSave <- "SQL_Entity_5_2500Millisecond"time.Sleep(2500 * time.Millisecond) // let the timer expire for SQL_Entity_3// Close the channelclose(suite.chanDemoSave)
}
代码动行结果:
Received SQL entity: SQL_Entity_1_300Millisecond
Received SQL entity: SQL_Entity_2_800Millisecond
Executing action after delay for entity: SQL_Entity_2_800Millisecond
Received SQL entity: SQL_Entity_3_900Millisecond
Received SQL entity: SQL_Entity_4_800Millisecond
Executing action after delay for entity: SQL_Entity_4_800Millisecond
Received SQL entity: SQL_Entity_5_2500Millisecond
Executing action after delay for entity: SQL_Entity_5_2500Millisecond
从运行结果看,只要超过700ms没有数据进入,就会引发定时器的回调,并且从2500ms的超时看只激发了一次,说明这里的定时器只会运行一次。没有超过700ms的,由于定时器被重置了,又开始等700ms才会运行,运行SQL_Entity_3时,定时器被删除,从结果看,虽然间隔是900ms远超700ms,依然定时器没有执行。接收到SQL_Entity_4时,由于timer已经为nil,因此又重新开启定时器
相关文章:
go里面关于超时的设计
设想一下你在接收源源不断的数据,如果有700ms没有收到,则认为是一个超时,需要做出处理。 逻辑上可以设计一个grouting,里面放一个通道,每收到一条数据进行相应处理。通道中夹杂一个timer定时器的处理,若通道在700ms内…...
Qt下使用ModbusTcp通信协议进行PLC线圈/保持寄存器的读写(32位有符号数)
文章目录 前言一、引入Modbus模块二、Modbus设备的连接三、各寄存器数据的读取四、各寄存器数据的写入五、示例完整代码总结 前言 本文主要讲述了使用Qt的Modbus模块来进行ModbusTcp的通信,实现对PLC的线圈寄存器和保持寄存器的读写,基于TCP/IP的Modbus…...
ElasticSearch学习2
1、索引的操作 1、创建索引 对ES的操作其实就是发送一个restful请求,kibana中在DevTools中进行ES操作 创建索引时需要注意ES的版本,不同版本的ES创建索引的语句略有差别,会导致失败 如下创建一个名为people的索引,settings&…...
3D角色展示
先看效果: 再看代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>3D卡片悬停</title><style>font-face {font-family: "Exoct";src: url("htt…...
前端面试:【Angular】打造强大Web应用的全栈框架
嗨,亲爱的Angular探险家!在前端开发的旅程中,有一个全栈框架,那就是Angular。Angular提供了模块化、组件化、依赖注入、路由和RxJS等特性,助力你构建强大、可扩展的Web应用。 1. 什么是Angular? Angular是…...
数据结构:栈和队列
文章目录 一、栈1.栈的概念及结构1.栈的概念及结构2.栈的实现 2.栈的顺序表实现1.栈的结构体和实现的功能函数2.栈的初始化,入栈和出栈操作3.栈的其他操作 3.栈的链表实现1.栈的结构体和实现的功能函数2.栈功能函数的实现 二、队列1.队列的概念及结构1.队列的概念及…...
SpringCloud Gateway服务网关的介绍与使用
目录 1、网关介绍2、SpringCloudGateway工作原理3、三大组件3.1 、Route(路由)3.2、断言 Predicate3.3、过滤器 filter 4、Gateway整合nacos的使用4.1 、引入依赖4.2、 编写基础类和启动类4.3、 编写基础配置和路由规则4.4 、测试结果 1、网关介绍 客户…...
深入解析:如何打造高效的直播视频美颜SDK
在当今数字化时代,视频直播已经成为人们交流、娱乐和信息传递的重要方式。然而,许多人在直播时都希望能够呈现出最佳的外观,这就需要高效的直播视频美颜技术。本文将深入解析如何打造高效的直播视频美颜SDK,以实现令人满意的视觉效…...
每日一博 - MPP(Massively Parallel Processing,大规模并行处理)架构
文章目录 概述优点缺点小结 概述 MPP(Massively Parallel Processing,大规模并行处理)架构是一种常见的数据库系统架构,主要用于提高数据处理性能。它通过将多个单机数据库节点组成一个集群,实现数据的并行处理。 在 …...
ssh框架原理及流程
1.hibernate工作原理: 读取并解析配置文件读取并解析映射信息,创建sessionFactory打开session创建事务transaction持久化操作提交事务关闭session关闭sessionFactory 为什么使用: 对JDBC访问数据库的代码做了封装,大大简化了数据…...
eslint 配置和用法
在一个使用Webpack的项目中配置ESLint,你可以按照以下步骤操作: 首先,你需要在你的项目中安装ESLint和对应的Webpack loader。你可以使用npm或者yarn来安装。在你的项目根目录下打开终端,然后运行以下命令: 使用npm&…...
字符设备驱动实例(PWM和RTC)
目录 五、PWM 六、RTC 五、PWM PWM(Pulse Width Modulation,脉宽调制器),顾名思义就是一个输出脉冲宽度可以调整的硬件器件,其实它不仅脉冲宽度可调,频率也可以调整。它的核心部件是一个硬件定时器,其工作原理可以用…...
Ribbon 源码分析
Ribbon 源码分析 Ribbon Debug 分析 断点 LoadBalancerInterceptor LoadBalancerInterceptor 实现了 ClientHttpRequestInterceptor 接口,重写了其中的 intercept 方法,用来拦截请求; 获取原始的 uri 和 服务名,调用 LoadBalanc…...
【1-3章】Spark编程基础(Python版)
课程资源:(林子雨)Spark编程基础(Python版)_哔哩哔哩_bilibili 第1章 大数据技术概述(8节) 第三次信息化浪潮:以物联网、云计算、大数据为标志 (一)大数据 大数据时代到来的原因…...
宇宙原理:黑洞基础。
宇宙原理:黑洞基础TOC 黑洞的数理基础:一个由满数组成的数盘,经过自然演进,将会逐步稀疏化、最终会向纯数方案发展;纯数方案虽然只有{2}、无数(虚拟)、{0,1,2,3}(虚拟)、…...
分类预测 | MATLAB实现SCNGO-CNN-LSTM-Attention数据分类预测
分类预测 | MATLAB实现SCNGO-CNN-LSTM-Attention数据分类预测 目录 分类预测 | MATLAB实现SCNGO-CNN-LSTM-Attention数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.SCNGO-CNN-LSTM-Attention数据分类预测程序,改进算法,融合正余弦和…...
Android学习之路(7) Frament
Fragment 表示应用界面中可重复使用的一部分。fragment 定义和管理自己的布局,具有自己的生命周期,并且可以处理自己的输入事件。fragment 不能独立存在。它们必须由 activity 或其他 fragment 托管。fragment 的视图层次结构会成为宿主的视图层次结构的…...
metallb , istio ingress 部署httpbin使用例子
安装metaillb,参考:Kubernetes的负载均衡方案:MetalLB - 文章详情 wget https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-frr.yaml -O metallb.yaml kubectl apply -f metallb-frr.yaml 配置负载均衡ip池 apiVe…...
基于swing的销售管理系统java仓库库存信息jsp源代码mysql
本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 基于swing的销售管理系统 系统有1权限:管…...
FreeCAD傻瓜式教程之约束设定和构建实体、开孔、调整颜色等
本内容基于官方教程中的绘制简单的零件中的体会,在初次绘制的时候,总是无法完成,几经尝试才发现其关键点所在,以此文记录,用以被查资料,同时也希望能够帮到纯白新手快速熟悉该软件的绘图方法。 一、. 打开…...
一文讲透编程基础的3大核心模块,新手入门再也不迷茫
文章目录前言一、数据结构:程序的骨架,没有它代码就是一盘散沙1.1 为什么AI写的代码你改不动?因为你不懂数据结构1.2 新手必学的5个核心数据结构,多一个都不用先学(1)数组:最基础也最重要的数据…...
copy4ai:专为AI工作流设计的智能复制工具,解决网页内容格式粘贴难题
1. 项目概述:一个为AI工作流设计的智能复制工具最近在折腾各种AI工具链的时候,我经常遇到一个挺烦人的问题:想把网页上的一段代码、一个表格,或者是一段带有特殊格式的文本,原封不动地喂给ChatGPT或者Claude࿰…...
Adafruit IO与WipperSnapper:无代码物联网开发实战指南
1. 项目概述与核心价值 如果你正在寻找一种能快速将硬件原型转化为可远程监控和控制的物联网设备的方法,那么Adafruit IO与WipperSnapper的组合绝对值得你花时间深入了解。这套方案的核心魅力在于,它几乎移除了传统物联网开发中最繁琐的环节——固件编程…...
Arduino与CircuitPython通过SPI Flash和FATFS实现数据无缝交换
1. 项目概述与核心价值在嵌入式开发领域,数据存储与交换一直是个绕不开的经典话题。无论是记录传感器数据、保存设备配置,还是实现固件的在线更新,我们都需要一个可靠、高效且易于管理的存储方案。SPI Flash芯片以其小巧的体积、低廉的成本和…...
5分钟搞定网页视频下载:VideoDownloadHelper免费插件终极指南
5分钟搞定网页视频下载:VideoDownloadHelper免费插件终极指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否经常遇到这样…...
ARM架构FPSID寄存器详解与应用
1. ARM架构中的FPSID寄存器解析在ARM处理器架构中,浮点系统ID寄存器(Floating-Point System ID Register, FPSID)是一个32位的系统寄存器,主要用于提供关于浮点实现的关键信息。这个寄存器在处理器设计中扮演着重要角色,特别是在需要精确控制…...
JIT推不动?精益生产看板+节拍管理,解决多品种小批量生产难题!
很多制造工厂推行JIT准时化生产时,都会陷入一个共性困境:多品种、小批量的生产模式下,订单批次多、批量小、切换频繁,导致生产计划混乱、工序衔接不畅、物料流动失控,JIT推行举步维艰——要么出现缺料停产,…...
期刊屡投不中?虎贲等考 AI:真文献 + 实证图表 + 期刊规范,高效冲击录用
职称评审、课题结题、科研评优、学业深造……一篇高质量期刊论文是所有学术人绕不开的硬指标。但框架难搭、文献难找、实证难做、格式难调、审稿太严,让无数人陷入 “写得慢、返修多、录用难” 的困境。通用 AI 爱编文献、普通工具无实证、办公软件不学术࿰…...
Refly开源AI智能体技能构建器:从Vibe到Skill的生产级实践
1. 项目概述:从“感觉”到“技能”,重新定义AI智能体开发如果你在过去一年里尝试过构建一个真正能在生产环境中稳定运行的AI智能体,大概率会和我有同样的感受:兴奋开始,混乱进行,最终陷入维护的泥潭。问题往…...
【Vivado】从零到一:深入解析Clock IP核的配置与实战应用
1. 初识Vivado Clock IP核:你的数字电路"心跳发生器" 想象一下,数字电路就像一个人体,而时钟信号就是维持生命的心跳。在FPGA设计中,Clock IP核就是专门负责生成这种"心跳"的智能模块。我第一次接触Vivado的C…...
