欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang實現(xiàn)超時退出的三種方式

 更新時間:2020年03月24日 15:37:34   作者:JackieZheng  
這篇文章主要介紹了Golang三種方式實現(xiàn)超時退出,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

前段時間發(fā)現(xiàn)線上有個服務接口,總是間歇性告警,有時候一天兩三次,有時候一天都沒有。

告警的邏輯是在一個接口中異步調用了另一個HTTP接口,這個HTTP接口調用出現(xiàn)超時。但是我去問了負責這個HTTP接口的同學,人家說他們的接口相應都是毫秒級別,還截圖監(jiān)控了,有圖有真相,我還能說啥。

但是,超時是確實存在的,只是請求還可能沒有到人家服務那邊。

這種偶發(fā)性問題不好復現(xiàn),偶爾來個告警也挺煩的,第一反應還是先解決問題,思路也簡單,失敗后重試。

解決方法

且不談重試策略,先說說什么時候觸發(fā)重試。

我們可以在接口請求出錯拋出err的時候重試,但是這種不好控制,如果一個請求出去,十來秒都沒有響應,則這個協(xié)程就要傻傻的等他報錯才能重試,浪費生命啊~

所以結合上面同學給出的毫秒級響應指標,可以設定一個超時時間,如果在指定超時時間后沒有返回結果,則重試(這篇重試不是重點)。

func AsyncCall() {
 ctx, cancel := context.WithTimeout(context.Background(), time.Duration(time.Millisecond*800))
 defer cancel()
 go func(ctx context.Context) {
 // 發(fā)送HTTP請求
 }()

 select {
 case <-ctx.Done():
 fmt.Println("call successfully!!!")
 return
 case <-time.After(time.Duration(time.Millisecond * 900)):
 fmt.Println("timeout!!!")
 return
 }
}

說明

1、通過context的WithTimeout設置一個有效時間為800毫秒的context。

2、該context會在耗盡800毫秒后或者方法執(zhí)行完成后結束,結束的時候會向通道ctx.Done發(fā)送信號。

3、有人可能要問,你這里已經(jīng)設置了context的有效時間,為什么還要加上這個time.After呢?

這是因為該方法內的context是自己申明的,可以手動設置對應的超時時間,但是在大多數(shù)場景,這里的ctx是從上游一直傳遞過來的,對于上游傳遞過來的context還剩多少時間,我們是不知道的,所以這時候通過time.After設置一個自己預期的超時時間就很有必要了。

4、注意,這里要記得調用cancel(),不然即使提前執(zhí)行完了,還要傻傻等到800毫秒后context才會被釋放。

總結

上面的超時控制是搭配使用了ctx.Done和time.After。

Done通道負責監(jiān)聽context啥時候完事,如果在time.After設置的超時時間到了,你還沒完事,那我就不等了,執(zhí)行超時后的邏輯代碼。

舉一反三

那么,除了上面這種超時控制策略,還有其他的套路嗎?

有,但是大同小異。

第一種:使用time.NewTimer

func AsyncCall() {
 ctx, cancel := context.WithTimeout(context.Background(), time.Duration(time.Millisecond * 800))
 defer cancel()
 timer := time.NewTimer(time.Duration(time.Millisecond * 900))

 go func(ctx context.Context) {
 // 發(fā)送HTTP請求
 }()

 select {
 case <-ctx.Done():
 timer.Stop()
 timer.Reset(time.Second)
 fmt.Println("call successfully!!!")
 return
 case <-timer.C:
 fmt.Println("timeout!!!")
 return
 }
}

這里的主要區(qū)別是將time.After換成了time.NewTimer,也是同樣的思路如果接口調用提前完成,則監(jiān)聽到Done信號,然后關閉定時器。

否則的話,會在指定的timer即900毫秒后執(zhí)行超時后的業(yè)務邏輯。

第二種:使用通道

func AsyncCall() {
 ctx := context.Background()
 done := make(chan struct{}, 1)

 go func(ctx context.Context) {
 // 發(fā)送HTTP請求
 done <- struct{}{}
 }()

 select {
 case <-done:
 fmt.Println("call successfully!!!")
 return
 case <-time.After(time.Duration(800 * time.Millisecond)):
 fmt.Println("timeout!!!")
 return
 }
}

1、這里主要利用通道可以在協(xié)程之間通信的特點,當調用成功后,向done通道發(fā)送信號。

2、監(jiān)聽Done信號,如果在time.After超時時間之前接收到,則正常返回,否則走向time.After的超時邏輯,執(zhí)行超時邏輯代碼。

3、這里使用的是通道和time.After組合,也可以使用通道和time.NewTimer組合。

總結

本篇主要介紹如何實現(xiàn)超時控制,主要有三種

1、context.WithTimeout/context.WithDeadline + time.After

2、context.WithTimeout/context.WithDeadline + time.NewTimer

3、channel + time.After/time.NewTimer

到此這篇關于Golang三種方式實現(xiàn)超時退出的文章就介紹到這了,更多相關Golang超時退出內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go語言微服務中實現(xiàn)鏈路追蹤

    Go語言微服務中實現(xiàn)鏈路追蹤

    在微服務架構中,鏈路追蹤技術可以幫助我們跟蹤請求在各個服務之間的傳播路徑,本文就來介紹一下Go語言微服務中實現(xiàn)鏈路追蹤,感興趣的可以了解一下
    2024-12-12
  • 從生成CRD到編寫自定義控制器教程示例

    從生成CRD到編寫自定義控制器教程示例

    這篇文章主要為大家介紹了從生成CRD到編寫自定義控制器的教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • golang 如何刪除二進制文件中的源碼路徑信息

    golang 如何刪除二進制文件中的源碼路徑信息

    這篇文章主要介紹了golang 如何刪除二進制文件中的源碼路徑信息,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go語言中時間time相關處理方法詳解

    Go語言中時間time相關處理方法詳解

    在Go語言中,time?包是處理時間和日期的核心,它提供了豐富的函數(shù)和方法,用于顯示、測量、計算、格式化、解析時間等,本文給大家詳細介紹了Go時間time相關處理方法的相關資料,需要的朋友可以參考下
    2024-10-10
  • Golang中使用errors返回調用堆棧信息

    Golang中使用errors返回調用堆棧信息

    這篇文章給大家介紹了Golang中如何使用errors返回調用堆棧信息,文章通過代碼示例給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2023-12-12
  • Go語言實現(xiàn)的簡單網(wǎng)絡端口掃描方法

    Go語言實現(xiàn)的簡單網(wǎng)絡端口掃描方法

    這篇文章主要介紹了Go語言實現(xiàn)的簡單網(wǎng)絡端口掃描方法,實例分析了Go語言網(wǎng)絡程序的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • VS Code配置Go語言開發(fā)環(huán)境的詳細教程

    VS Code配置Go語言開發(fā)環(huán)境的詳細教程

    這篇文章主要介紹了VS Code配置Go語言開發(fā)環(huán)境的詳細教程,本文通過實例代碼圖文相結合的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • Go每日一庫之quicktemplate的使用

    Go每日一庫之quicktemplate的使用

    quicktemplate快速、功能強大、易于使用的Go模板引擎。比html/模板快20倍,本文我們就詳細的介紹一下quicktemplate的具體使用,感興趣的可以了解一下
    2021-07-07
  • 深入淺出Go:掌握基礎知識的關鍵要點

    深入淺出Go:掌握基礎知識的關鍵要點

    Go是一種開源的編程語言,由Google開發(fā),它具有簡潔、高效、并發(fā)性強的特點,適用于構建可靠的、高性能的軟件系統(tǒng),本文將介紹Go的基礎知識,需要的朋友可以參考下
    2023-10-10
  • 如何使用大學教育郵箱下載golang等軟件(推薦)

    如何使用大學教育郵箱下載golang等軟件(推薦)

    這篇文章主要介紹了如何使用大學教育郵箱下載goland等軟件,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09

最新評論