最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go語言心跳超時的實(shí)現(xiàn)示例

 更新時間:2022年05月13日 11:46:19   作者:大錘愛編程  
本文主要介紹了go語言心跳超時的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、背景

本文描述的是客戶端接收心跳信息的超時實(shí)現(xiàn)。心跳超時,或者接受信息超過限定時間在分布式系統(tǒng)中出現(xiàn)的次數(shù)比較多。常見的就有hadoop中節(jié)點(diǎn)超時,或者日志中出現(xiàn)timeout的字樣。

在學(xué)習(xí)go語言中,我也根據(jù)go語言的機(jī)制實(shí)現(xiàn)了心跳超時的這個問題。踩過坑,趟過水。

二、心跳超時的實(shí)現(xiàn)

2.1 通過select case (設(shè)計概念比較多)

這種方法實(shí)現(xiàn)心跳,需要對go語言中的channel和select case 機(jī)制有所了解。select代碼段中沒有包含default條件時,會一直阻塞到有通道操作。

需要注意的是?。。?! select語言只會阻塞一次,且執(zhí)行一次。如果需要多次判斷,或者可能有多個case條件需要滿足,那就需要增加for語句。

首先需要知道的是select是專為channel設(shè)計的,所以說每個case表達(dá)式都必須是包含操作通道的表達(dá)式。下面這段代碼是描述了隨機(jī)抽取一個channel發(fā)消息,正常情況下,不會觸發(fā)超時。為了觸發(fā)超時,注釋掉通道發(fā)送數(shù)據(jù)操作。超時五秒,則觸發(fā)超時。

package main
 
import (
    "fmt"
    "math/rand"
    "time"
)
 
func main() {
    // 準(zhǔn)備好三個通道。
    intChannels := [3]chan int{
        make(chan int, 1),
        make(chan int, 1),
        make(chan int, 1),
    }
    // 隨機(jī)選擇一個通道,并向它發(fā)送元素值。
    index := rand.Intn(3)
    fmt.Printf("The index: %d\n", index)
 
    //?? 取消這行代碼的注視,超時條件的選擇就會觸發(fā)。
    //intChannels[index] <- index
    // 哪一個通道中有可取的元素值,哪個對應(yīng)的分支就會被執(zhí)行。
    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()實(shí)現(xiàn)超時操作,是比較巧妙的。一般來說心跳超時是一個雙方交互的行為。

下面畫一個圖來描述一下。

 為了方便理解,定義雙方都使用共同時間。

下面是代碼。

基本的邏輯是:

        1、先給客戶端設(shè)置一個下次超時的時間

         2、客戶端每次收到心跳的時候,更新這個時間

         3、開啟一個獨(dú)立的線程,一致判斷當(dāng)前客戶端是否超時。

ps:結(jié)合時效和性能,可以間隔一定的時間來進(jìn)行判斷。

package main
 
import (
    "fmt"
    "sync"
    "time"
)
 
type Client struct {
    lock sync.Mutex //加鎖
    nextTimeOutTime time.Time //下次超時時間
}
 
const tenSec = 10
/**
刷新每次的心跳超時機(jī)制
 */
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 請求發(fā)送時間\n", time.Now())
        client.receiveHeart()
    }
 
}
 
func main() {
    client := Client{
        lock:            sync.Mutex{},
        nextTimeOutTime: time.Time{},
    }
    //在當(dāng)前時刻,更新下次的超時時刻是10s中后
    client.freshTimeOutTime()
 
 
    go pingClient(&client)
 
 
    go client.judgeTimeOut()
 
    for true {
 
    }
}

三、個人的實(shí)現(xiàn)觀感

使用select case 和 time.sleep實(shí)現(xiàn)超時的最大區(qū)別在于,time.sleep沒有太多的??語言相關(guān)的語法和知識,更容易理解和掌握。相對于channel來說,掌握需要了解channel的基本使用方法,一些常見的特性等。

到此這篇關(guān)于go語言心跳超時的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)go語言心跳超時內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • GO語言實(shí)現(xiàn)二維碼掃碼的示例代碼

    GO語言實(shí)現(xiàn)二維碼掃碼的示例代碼

    你對二維碼掃碼的流程有困惑嗎,這篇文章就結(jié)合筆者自身的開發(fā)經(jīng)驗(yàn)進(jìn)行分享,讓大家熟悉并掌握此功能,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧
    2023-06-06
  • Golang使用pprof檢查內(nèi)存泄漏的全過程

    Golang使用pprof檢查內(nèi)存泄漏的全過程

    pprof 是golang提供的一款分析工具,可以分析CPU,內(nèi)存的使用情況,本篇文章關(guān)注它在分析內(nèi)存泄漏方面的應(yīng)用,本文給大家介紹了Golang使用pprof檢查內(nèi)存泄漏的全過程,文中通過代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • Golang實(shí)現(xiàn)web文件共享服務(wù)的示例代碼

    Golang實(shí)現(xiàn)web文件共享服務(wù)的示例代碼

    這篇文章主要介紹了Golang實(shí)現(xiàn)web文件共享服務(wù)的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • Golang?strings包常用字符串操作函數(shù)

    Golang?strings包常用字符串操作函數(shù)

    Golang?中的字符串統(tǒng)一使用?UTF-8?(屬于Unicode編碼的一種實(shí)現(xiàn)方式)進(jìn)行編碼,本篇文章將結(jié)合具體實(shí)例對常用的字符串操作函數(shù)進(jìn)行介紹,感興趣的可以了解一下
    2021-12-12
  • B站新一代 golang規(guī)則引擎gengine基礎(chǔ)語法

    B站新一代 golang規(guī)則引擎gengine基礎(chǔ)語法

    這篇文章主要為大家介紹了B站新一代 golang規(guī)則引擎gengine基礎(chǔ)語法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • go設(shè)置多個GOPATH的方式

    go設(shè)置多個GOPATH的方式

    這篇文章主要介紹了go設(shè)置多個GOPATH的方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • go語言接口用法實(shí)例分析

    go語言接口用法實(shí)例分析

    這篇文章主要介紹了go語言接口用法,實(shí)例分析了Go語言接口的定義及使用技巧,需要的朋友可以參考下
    2015-03-03
  • golang實(shí)現(xiàn)openssl自簽名雙向認(rèn)證的詳細(xì)步驟

    golang實(shí)現(xiàn)openssl自簽名雙向認(rèn)證的詳細(xì)步驟

    這篇文章主要介紹了golang實(shí)現(xiàn)openssl自簽名雙向認(rèn)證的詳細(xì)步驟,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-03-03
  • Go語言通過TCP協(xié)議實(shí)現(xiàn)聊天室功能

    Go語言通過TCP協(xié)議實(shí)現(xiàn)聊天室功能

    這篇文章主要為大家詳細(xì)介紹了Go語言中如何通過TCP協(xié)議實(shí)現(xiàn)聊天室功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • go?sync.Once實(shí)現(xiàn)高效單例模式詳解

    go?sync.Once實(shí)現(xiàn)高效單例模式詳解

    這篇文章主要為大家介紹了go?sync.Once實(shí)現(xiàn)高效單例模式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03

最新評論

会同县| 涟源市| 定西市| 文成县| 酉阳| 长汀县| 东乌| 酉阳| 九江县| 绥滨县| 兰州市| 长沙县| 和硕县| 郴州市| 日土县| 长武县| 黔西| 二手房| 大安市| 齐河县| 彭山县| 清镇市| 雷山县| 泸水县| 宕昌县| 汝南县| 陵川县| 平塘县| 清流县| 辽阳县| 靖边县| 台山市| 万全县| 辰溪县| 大港区| 平远县| 手游| 荥阳市| 治多县| 巴彦淖尔市| 天水市|