婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Go 協程超時控制的實現

Go 協程超時控制的實現

熱門標簽:百度地圖標注位置網站 武漢百應人工智能電銷機器人 智能語音電銷的機器人 400手機電話免費辦理 揚州電銷外呼系統軟件 如何利用高德地圖標注家 開通400電話申請流程 上海企業外呼系統排名 電腦外呼系統輻射大嗎

Go 協程超時控制

  • Select 阻塞方式
  • Context 方式

先說個場景:

假設業務中 A 服務需要調用 服務B,要求設置 5s 超時,那么如何優雅實現?

Select 超時控制

考慮是否可以用 select + time.After 方式進行實現

這里主要利用的是通道在攜程之間通信的特點,當程序調用成功后,會向通道中發送信號。沒調用成功前,通道會阻塞。

select {
 case res := -c2:
  fmt.Println(res)
 case -time.After(time.Second * 3):
  fmt.Println("timeout 2")
 }

當 c2 通道中有數據時,并且超時時間沒有達到 3s,走 case res := -c2 這個業務邏輯,當超時時間達到 3s , 走的 case -time.After(time.Second * 3) 這個業務邏輯, 這樣就可以實現超時 3s 的控制。

res:= -c2 是因為channel 可以實現阻塞,那么 time.After 為啥可以阻塞呢?

看 After 源碼。sleep.go 可以看到其實也是 channel

func After(d Duration) -chan Time {
 return NewTimer(d).C
}

完整代碼示例:

package timeout

import (
 "fmt"
 "testing"
 "time"
)

func TestSelectTimeOut(t *testing.T) {
 // 在這個例子中, 假設我們執行了一個外部調用, 2秒之后將結果寫入c1
 c1 := make(chan string, 1)
 go func() {
  time.Sleep(time.Second * 2)
  c1 - "result 1"
 }()
 // 這里使用select來實現超時, `res := -c1`等待通道結果,
 // `- Time.After`則在等待1秒后返回一個值, 因為select首先
 // 執行那些不再阻塞的case, 所以這里會執行超時程序, 如果
 // `res := -c1`超過1秒沒有執行的話
 select {
 case res := -c1:
  fmt.Println(res)
 case -time.After(time.Second * 1):
  fmt.Println("timeout 1")
 }
 // 如果我們將超時時間設為3秒, 這個時候`res := -c2`將在
 // 超時case之前執行, 從而能夠輸出寫入通道c2的值
 c2 := make(chan string, 1)
 go func() {
  time.Sleep(time.Second * 2)
  c2 - "result 2"
 }()
 select {
 case res := -c2:
  fmt.Println(res)
 case -time.After(time.Second * 3):
  fmt.Println("timeout 2")
 }
}

運行結果:

=== RUN   TestSelectTimeOut
timeout 1
result 2
--- PASS: TestSelectTimeOut (3.00s)
PASS

go timer 計時器

這個是 timer 類似的計時器實現,通用也是通過通道來發送數據。

package main
import "time"
import "fmt"
func main() {
  // Ticker使用和Timer相似的機制, 同樣是使用一個通道來發送數據。
  // 這里我們使用range函數來遍歷通道數據, 這些數據每隔500毫秒被
  // 發送一次, 這樣我們就可以接收到
  ticker := time.NewTicker(time.Millisecond * 500)
  go func() {
    for t := range ticker.C {
    fmt.Println("Tick at", t)
    }
  }()
  // Ticker和Timer一樣可以被停止。 一旦Ticker停止后, 通道將不再
  // 接收數據, 這里我們將在1500毫秒之后停止
  time.Sleep(time.Millisecond * 1500)
  ticker.Stop()
  fmt.Println("Ticker stopped")
}

go context

context 監聽是否有 IO 操作,開始從當前連接中讀取網絡請求,每當讀取到一個請求則會將該cancelCtx傳入,用以傳遞取消信號,可發送取消信號,取消所有進行中的網絡請求。

  go func(ctx context.Context, info *Info) {
   timeLimit := 120
   timeoutCtx, cancel := context.WithTimeout(ctx, time.Duration(timeLimit)*time.Millisecond)
   defer func() {
    cancel()
    wg.Done()
   }()
   resp := DoHttp(timeoutCtx, info.req)
  }(ctx, info)

關鍵看業務代碼: resp := DoHttp(timeoutCtx, info.req) 業務代碼中包含 http 調用 NewRequestWithContext

req, err := http.NewRequestWithContext(ctx, "POST", url, strings.NewReader(paramString))

上面的代碼,設置了過期時間,當DoHttp(timeoutCtx, info.req) 處理時間超過超時時間時,會自動截止,并且打印 context deadline exceeded。

看個代碼:

package main

import (
 "context"
 "fmt"
 "testing"
 "time"
)

func TestTimerContext(t *testing.T) {
 now := time.Now()
 later, _ := time.ParseDuration("10s")

 ctx, cancel := context.WithDeadline(context.Background(), now.Add(later))
 defer cancel()
 go Monitor(ctx)

 time.Sleep(20 * time.Second)

}

func Monitor(ctx context.Context) {
 select {
 case -ctx.Done():
  fmt.Println(ctx.Err())
 case -time.After(20 * time.Second):
  fmt.Println("stop monitor")
 }
}

運行結果:

=== RUN   TestTimerContext
context deadline exceeded
--- PASS: TestTimerContext (20.00s)
PASS

Context 接口有如下:

type Context interface {
    Deadline() (deadline time.Time, ok bool)
    Done() -chan struct{}
    Err() error
    Value(key interface{}) interface{}
}
  • Deadline — 返回 context.Context 被取消的時間,也就是完成工作的截止日期;
  • Done — 返回一個 Channel,這個 Channel 會在當前工作完成或者上下文被取消之后關閉,多次調用 Done 方法會返回同一個 Channel;
  • Err — 返回 context.Context 結束的原因,它只會在 Done 返回的 Channel 被關閉時才會返回非空的值;
    • 如果 context.Context 被取消,會返回 Canceled 錯誤;
    • 如果 context.Context 超時,會返回 DeadlineExceeded 錯誤;
  • Value — 從 context.Context 中獲取鍵對應的值,對于同一個上下文來說,多次調用 Value 并傳入相同的 Key 會返回相同的結果,該方法可以用來傳遞請求特定的數據;

到此這篇關于Go 協程超時控制的實現的文章就介紹到這了,更多相關Go 協程超時控制內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 一文搞懂如何實現Go 超時控制
  • GoLang之使用Context控制請求超時的實現
  • Go語言利用time.After實現超時控制的方法詳解
  • 詳解Golang 中的并發限制與超時控制

標簽:江西 新余 武漢 延邊 黑龍江 宜賓 張掖 嘉峪關

巨人網絡通訊聲明:本文標題《Go 協程超時控制的實現》,本文關鍵詞  協程,超時,控制,的,實現,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Go 協程超時控制的實現》相關的同類信息!
  • 本頁收集關于Go 協程超時控制的實現的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    91亚洲国产成人精品一区二三| 91亚洲男人天堂| 国产91精品久久久久久久网曝门| 成人激情文学综合网| 日韩亚洲欧美综合| 亚洲男人的天堂在线aⅴ视频| 丝袜诱惑亚洲看片 | 久久综合狠狠综合| 亚洲激情五月婷婷| 国产福利一区二区三区视频| 欧美日韩三级视频| 亚洲少妇屁股交4| 国产在线国偷精品免费看| 欧美性受xxxx黑人xyx| 国产精品久99| 国产激情视频一区二区三区欧美| 欧美精品免费视频| 亚洲免费看黄网站| 精品午夜一区二区三区在线观看| 久久噜噜亚洲综合| 秋霞国产午夜精品免费视频| 在线观看一区二区精品视频| 亚洲国产精品成人综合| 免费日本视频一区| 6080国产精品一区二区| 一区二区在线观看视频| 99精品久久99久久久久| 国产精品私人影院| 成人午夜私人影院| 久久精品一二三| 韩国精品主播一区二区在线观看 | 成人福利电影精品一区二区在线观看 | 在线日韩av片| 一区二区三区欧美| 在线视频你懂得一区| 1024精品合集| 色哟哟一区二区在线观看| 国产精品久久久久久久久久久免费看 | 亚洲三级电影全部在线观看高清| 成人听书哪个软件好| 国产欧美精品一区二区色综合朱莉| 国产伦精品一区二区三区视频青涩| 精品国产乱码久久| 丁香天五香天堂综合| 中文字幕乱码日本亚洲一区二区 | 国产精品亚洲第一区在线暖暖韩国| 久久综合久久久久88| 国产成人99久久亚洲综合精品| 国产清纯白嫩初高生在线观看91 | 中文字幕不卡在线播放| 99精品视频在线观看| 亚洲精品v日韩精品| 欧美日本一道本在线视频| 美女精品一区二区| 日本一区二区久久| 色呦呦一区二区三区| 日韩精品一二三区| 日本一区免费视频| 色乱码一区二区三区88| 午夜视频在线观看一区二区三区| 日韩视频中午一区| 成人一级片网址| 亚洲午夜羞羞片| 精品美女一区二区| 91亚洲精品乱码久久久久久蜜桃| 亚洲成人精品影院| 国产香蕉久久精品综合网| 日本精品一区二区三区四区的功能| 视频一区二区中文字幕| 久久久精品综合| 欧美日韩在线观看一区二区| 精品一区二区三区免费毛片爱| 国产精品欧美一区二区三区| 欧美日韩国产免费一区二区| 国产一区二区三区久久久| 尤物在线观看一区| 久久久久国产一区二区三区四区| 色综合天天视频在线观看| 极品销魂美女一区二区三区| 亚洲狠狠丁香婷婷综合久久久| 亚洲精品在线网站| 欧美日韩国产天堂| 色网站国产精品| 国产a精品视频| 卡一卡二国产精品| 一区二区理论电影在线观看| 国产三区在线成人av| 日韩三级av在线播放| 欧美综合天天夜夜久久| 成人午夜电影网站| 国产在线不卡一卡二卡三卡四卡| 亚洲一区二区三区不卡国产欧美| 国产日韩欧美一区二区三区综合| 欧美三级在线播放| 在线观看亚洲a| 91美女片黄在线| 99国产麻豆精品| 成人丝袜高跟foot| 国产精品1024| 国产一区二区三区久久久 | 亚洲伦在线观看| 国产香蕉久久精品综合网| 日韩一区国产二区欧美三区| 欧美日韩一区二区不卡| 在线观看日韩国产| 色八戒一区二区三区| 91在线播放网址| 一本久久综合亚洲鲁鲁五月天 | 一区在线观看免费| 国产精品久久久久毛片软件| 国产视频亚洲色图| 国产精品美女久久久久久久网站| 国产日韩在线不卡| 中文字幕av资源一区| 国产精品素人一区二区| 国产精品久久久久久久岛一牛影视 | 99久久国产综合精品麻豆| av在线播放成人| 91啪九色porn原创视频在线观看| 99久久综合99久久综合网站| 色综合久久久久久久| 欧美性受xxxx黑人xyx| 欧美精品乱码久久久久久| 日韩午夜三级在线| 久久精品一区二区三区不卡牛牛| 国产亚洲综合色| 亚洲色大成网站www久久九九| 亚洲三级在线观看| 日日夜夜免费精品视频| 久久精品国内一区二区三区| 国产尤物一区二区在线| av不卡在线观看| 欧美三级中文字幕| 精品福利二区三区| 亚洲天堂免费看| 日韩av一区二区三区四区| 麻豆91在线观看| a亚洲天堂av| 欧美精三区欧美精三区| 久久一区二区视频| 亚洲精品大片www| 老司机精品视频一区二区三区| 国产精品1区二区.| 色欧美片视频在线观看 | 欧美亚州韩日在线看免费版国语版| 欧美日韩国产在线观看| 国产视频一区在线观看| 亚洲一区二区三区美女| 国产福利一区二区| 欧美视频日韩视频| 国产视频一区不卡| 天堂精品中文字幕在线| 国产成人av网站| 欧美精品一卡两卡| 国产精品久久久久影院色老大| 亚洲444eee在线观看| 国产一区二区成人久久免费影院| 色综合 综合色| 国产视频一区在线观看| 亚洲一线二线三线视频| 国产一区二区三区高清播放| 欧美性色黄大片| 日本一区二区动态图| 日本成人在线视频网站| 91同城在线观看| 久久综合色之久久综合| 亚洲成人高清在线| av一区二区三区黑人| 精品奇米国产一区二区三区| 亚洲图片欧美一区| 99久久久国产精品| 久久久高清一区二区三区| 亚欧色一区w666天堂| 91捆绑美女网站| 中文字幕欧美国产| 韩日精品视频一区| 91精品国产免费| 亚洲最新在线观看| 91蜜桃网址入口| 专区另类欧美日韩| 粉嫩av一区二区三区在线播放 | 亚洲综合激情网| 91亚洲资源网| 亚洲三级在线免费观看| 成人综合激情网| 国产亚洲一区字幕| 国产一区免费电影| 国产亚洲欧美中文| 国产乱码字幕精品高清av| 日韩一二三四区| 蜜臀av一区二区| 日韩毛片精品高清免费| 成人国产亚洲欧美成人综合网| 国产日韩欧美激情| 风间由美一区二区av101 | 亚洲国产美女搞黄色| 欧洲亚洲国产日韩| 亚洲综合精品自拍| 欧美一区二区国产| 美女视频一区二区|