91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

go語言心跳超時怎么實現

發布時間:2022-05-13 13:47:08 來源:億速云 閱讀:210 作者:iii 欄目:開發技術

這篇文章主要介紹了go語言心跳超時怎么實現的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇go語言心跳超時怎么實現文章都會有所收獲,下面我們一起來看看吧。

一、背景

本文描述的是客戶端接收心跳信息的超時實現。心跳超時,或者接受信息超過限定時間在分布式系統中出現的次數比較多。常見的就有hadoop中節點超時,或者日志中出現timeout的字樣。

二、心跳超時的實現

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()實現超時操作,是比較巧妙的。一般來說心跳超時是一個雙方交互的行為。

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

go語言心跳超時怎么實現

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

下面是代碼。

基本的邏輯是:

        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 {
 
    }
}

關于“go語言心跳超時怎么實現”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“go語言心跳超時怎么實現”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

松溪县| 海阳市| 江山市| 舟曲县| 庆阳市| 津市市| 巴彦县| 斗六市| 宁都县| 甘孜县| 盘山县| 昌邑市| 阜新市| 无棣县| 盈江县| 台北市| 东至县| 吉安市| 灵宝市| 北碚区| 罗田县| 临洮县| 永宁县| 洛南县| 扶风县| 罗甸县| 娄底市| 梁山县| 阿图什市| 丹凤县| 格尔木市| 林周县| 临颍县| 若羌县| 卫辉市| 文水县| 鲁甸县| 琼中| 龙泉市| 扎兰屯市| 荣昌县|