Goroutine心跳检测

心跳检测的核心思想是,单独启动心跳协程,然后通过向协程发送数据,表示心跳。

package main
import ("fmt""math/rand""time"
)
func main() {rand.Seed(time.Now().UnixNano())doWork := func(done <-chan interface{},pulseInterval time.Duration,genData func() interface{},) (<-chan interface{}, <-chan interface{}) {heartBeat := make(chan interface{}) // 心跳results := make(chan interface{})go func() {defer close(heartBeat)defer close(results)sendPulse := func() {select {case heartBeat <- struct{}{}:default: // 心跳不一定有人接收}}pulse := time.Tick(pulseInterval)sendResult := func(r interface{}) {for {select {case <-done:returncase <-pulse: // 接收channel可能阻塞,因此持续心跳sendPulse()case results <- r:return // 耗时任务完成后,立刻返回}}}bridge := make(chan interface{})go func() {defer close(res)bridge <- genData()  // 我们假设会一直等到有数据发送过来}()for {select {case <-done:returncase <-pulse:sendPulse()case r, ok := <-res:if !ok { // 前边有关掉res了,所以这里需要ok判断return}sendResult(r)}}}()return heartBeat, results}genMyData := func() interface{} {t := rand.Intn(10) + 3time.Sleep(time.Second * time.Duration(t))fmt.Printf("genMyData weak up after:%v\n", t)return "foo"}done := make(chan interface{})defer close(done)interval := time.SecondheatBeat, result := doWork(done,interval, genMyData)for {select {case _, ok := <-heatBeat:if !ok {return}fmt.Println("hearbeat")case r, ok := <-result:if !ok {return}fmt.Printf("get result: %v\n", r)case <-time.After(interval * 2):  // 2倍心跳时间找不到心跳信号,则认为超时fmt.Printf("timeout")return}}
}

Goroutine心跳检测相关推荐

  1. socket心跳机制图片_WebSocket心跳检测和重连机制

    1. 心跳重连原由 心跳和重连的目的用一句话概括就是客户端和服务端保证彼此还活着,避免丢包发生. websocket连接断开有以下两种情况: 前端断开 在使用websocket过程中,可能会出现网络断 ...

  2. socket心跳检测

    一.什么是心跳检测 判断对方(设备,进程或其它网元)是否正常动行,一般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于检测TCP的异常断开. 基本原因是服务器端不能 ...

  3. 心跳检测以及应用层心跳包机制设计

    博主联系方式: QQ:1540984562 微信:wxid_nz49532kbh9u22 QQ交流群:892023501(嵌入式方向) QQ交流群:856398158(后端方向) 目录 心跳检测应用场 ...

  4. websocket心跳检测前后端架构

    websocket心跳检测前后端架构 本篇文章为初略架构websocket在前后端的心跳检测机制,实现相对毛糙. 下面介绍内容参照 廖雪峰 的描述,为了切换页面麻烦,这里就直接挑简要的信息复制黏贴过来 ...

  5. Java笔记-JDBC心跳检测及断开重连线程实例

    这里自己写了个JDBC心跳检测及断开重连线程: 运行截图如下: 心跳的时候运行ipconfig /release 然后再给他ipconfig /renew回去: 关键代码如下: Maven: < ...

  6. netty的编解码、粘包拆包问题、心跳检测机制原理

    文章目录 1. 编码解码器 2. 编解码序列化机制的性能优化 3. Netty粘包拆包 4. Netty心跳检测机制 5. Netty断线自动重连实现 1. 编码解码器 当你通过netty发送或者接受 ...

  7. Netty空闲心跳检测机制

    概述 Netty提供了一个读写空闲心跳检测机制的Handler,用于检测读空闲.写空闲.读写空闲. 如果服务端在一定时间内没有执行读请求,就会触发读空闲事件,一定时间内没有执行写请求,就会触发写空闲事 ...

  8. 95-850-020-源码-心跳-JobMaster与TaskExecutor之间的心跳检测

    文章目录 1.概述 2.JobMaster与TaskExecutor之间的心跳检测 2.1 初始化过程 2.1.1 JobMaster启动 2.1.2 TaskExecutor 2.3.注册过程 2. ...

  9. haproxy心跳检测_haproxy 非常完整的配置

    常用配置选项: OPTION 选项: option httpclose :HAProxy会针对客户端的第一条请求的返回添加cookie并返回给客户端,客户端发送后续请求时会发送 此cookie到HAP ...

最新文章

  1. Tangram base的设计思路
  2. Py之gensim:gensim的简介、安装、使用方法之详细攻略
  3. 10kv电压互感器型号_电气行业需要知道的10KV电压互感器基本技术参数
  4. Android OpenGL显示任意3D模型文件
  5. 在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新。
  6. 零基础适合学python吗-学Python需要什么基础知识?零基础可以学Python吗?
  7. python笔试和面试题汇总(免费下载)
  8. AI复活明朝历代皇帝,来一场穿越时空的对话!
  9. 悟空CRM(PHP版本)安装教程
  10. java开源项目-SpringBoot在线教育平台
  11. MATLAB关系运算符和逻辑运算符
  12. 公众号及小程序的测试点
  13. win10系统电脑点击桌面图标没反应怎么处理
  14. 系统集成项目管理工程师(软考中级)—— 第二十二章 安全管理 笔记分享
  15. Flixel Dame 坦克大战(一)地图
  16. 实例分割最全综述(上):二阶段实例分割和一阶段实例分割
  17. 高频面试题之JVM灵魂拷问,21题带你通关!
  18. 搭建ARM交叉编译环境
  19. BestCoder Round #85 (hdu5804,hdu5805,hdu5806,hdu5807)
  20. python仿真入门_python基础-入门

热门文章

  1. 安卓马赛克view_Android马赛克效果MosaicView
  2. 人脸关键点: Wing Loss for Robust Facial Landmark Localisation with Convolutional Neural Networks
  3. OpenCV:使用python-cv2实现视频的分解与合成
  4. 实验2.2编写重载函数Max1
  5. Android编程中利用AudioTrack播放PCM数据在音频的最后出现重复回声现象的解决方案
  6. 使用RDKit将pdb文件转成SMILES
  7. redis五种常见的数据结构
  8. 整数类型及整数类型的显示转换
  9. 【Android】自定义 Tabhost
  10. Linux各个目录的用途