婷婷综合国产,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
    久久久精品中文字幕麻豆发布| 99这里只有久久精品视频| 综合av第一页| 中文字幕一区二区三区在线不卡| 久久影院午夜论| 久久精品一区二区三区av| 精品国产麻豆免费人成网站| 精品国产一二三区| 欧美激情资源网| 国产精品成人网| 亚洲人成网站精品片在线观看| 国产精品福利电影一区二区三区四区 | 亚洲二区视频在线| 午夜精品久久久久久久 | 精品成人免费观看| 精品久久一区二区三区| 国产欧美精品一区二区色综合| 欧美国产一区视频在线观看| 国产精品欧美极品| 亚洲综合色丁香婷婷六月图片| 一区二区免费看| 日欧美一区二区| 韩国女主播成人在线观看| 国产成a人亚洲精| 一本大道久久a久久精二百| 欧美日韩一级二级| 久久久久久久久久久久久女国产乱| 久久久亚洲欧洲日产国码αv| 国产精品嫩草影院com| 亚洲国产aⅴ天堂久久| 视频一区在线视频| a美女胸又www黄视频久久| 欧美午夜精品电影| 久久久精品tv| 亚洲国产一区二区视频| 国内精品在线播放| 91极品美女在线| 久久亚洲春色中文字幕久久久| 亚洲丝袜自拍清纯另类| 麻豆精品视频在线| 93久久精品日日躁夜夜躁欧美| 欧美精品tushy高清| 国产精品欧美久久久久一区二区| 天天操天天色综合| 成人蜜臀av电影| 精品少妇一区二区| 亚洲r级在线视频| 国产成人综合在线观看| 欧美精品自拍偷拍动漫精品| 国产精品免费久久| 国内一区二区视频| 欧美一级高清大全免费观看| 国产精品久久久久毛片软件| 蜜臀av国产精品久久久久| 91视视频在线观看入口直接观看www| 日韩欧美另类在线| 香蕉乱码成人久久天堂爱免费| 成人sese在线| 国产日本亚洲高清| 国内外成人在线视频| 日韩一卡二卡三卡四卡| 亚洲综合男人的天堂| 99re成人精品视频| 国产欧美精品一区二区三区四区 | 久久97超碰国产精品超碰| 欧美唯美清纯偷拍| 亚洲欧美日韩精品久久久久| 国产成人精品三级| 久久九九久精品国产免费直播| 免费高清成人在线| 91精品在线一区二区| 视频在线观看一区| 制服丝袜在线91| 三级欧美在线一区| 91精品国产91热久久久做人人| 午夜久久久久久电影| 欧美日韩激情在线| 免费在线观看不卡| 欧美成人vr18sexvr| 国产一区二区精品久久99 | 国产精品77777| 国产亚洲精品中文字幕| 麻豆精品国产传媒mv男同 | 国产精品色噜噜| 成人国产精品免费| 亚洲欧洲日韩av| 99久免费精品视频在线观看| 国产精品久久久久一区 | 日韩女优毛片在线| 国产主播一区二区三区| 中日韩av电影| 91福利精品视频| 亚洲影视在线观看| 日韩欧美国产综合一区 | 亚洲成人自拍偷拍| 678五月天丁香亚洲综合网| 久久不见久久见免费视频7| 久久久不卡影院| 99久久国产综合精品色伊| 亚洲国产你懂的| 久久亚洲影视婷婷| 色综合天天综合网国产成人综合天 | 欧美一区二区三区四区五区 | 婷婷开心激情综合| 精品国产一区二区亚洲人成毛片| 成人h版在线观看| 亚洲综合久久av| 日韩欧美电影一二三| av在线不卡免费看| 蜜桃av一区二区| 综合久久久久久久| 欧美大片在线观看一区| 99国产欧美久久久精品| 秋霞影院一区二区| 亚洲欧美电影一区二区| 欧美不卡一区二区| 91色.com| 国产精品一区二区久激情瑜伽| 亚洲图片欧美综合| 国产亚洲人成网站| 欧美日韩国产综合视频在线观看| 成人免费看黄yyy456| 丝袜美腿成人在线| 亚洲精品日日夜夜| 国产精品天干天干在线综合| 欧美美女一区二区在线观看| 成人理论电影网| 麻豆久久久久久| 亚洲第一二三四区| 中文字幕在线不卡| 久久久久久亚洲综合| 日韩三级伦理片妻子的秘密按摩| 色婷婷av一区二区三区软件 | 精品国产网站在线观看| 精品婷婷伊人一区三区三| 成人av片在线观看| 国产乱码精品1区2区3区| 日本一区中文字幕| 午夜精品福利一区二区蜜股av| 亚洲视频一区在线| 综合久久综合久久| 中文字幕高清不卡| 国产精品久久久久一区二区三区共| 日韩精品最新网址| 日韩欧美一区在线| 精品国产亚洲在线| 久久影院午夜片一区| 久久这里只有精品6| 欧美成人高清电影在线| 精品国产99国产精品| 日韩女优电影在线观看| 欧美大胆人体bbbb| 亚洲精品一线二线三线| 精品免费日韩av| 精品处破学生在线二十三| 久久免费午夜影院| 国产视频一区不卡| 亚洲视频免费观看| 亚洲国产日韩一级| 青青草国产精品97视觉盛宴| 日韩高清一区在线| 久久国产精品99久久久久久老狼 | 制服丝袜一区二区三区| 777午夜精品免费视频| 日韩欧美国产综合| 欧美极品少妇xxxxⅹ高跟鞋| 国产精品电影院| 亚洲在线中文字幕| 日韩电影在线一区二区三区| 免费在线观看一区| 成人免费视频视频在线观看免费 | 亚洲国产精品人人做人人爽| 亚洲成av人在线观看| 激情综合网天天干| 99久久99久久精品免费观看| 欧美亚洲另类激情小说| 日韩午夜在线观看视频| 日本一区二区综合亚洲| 夜夜亚洲天天久久| 国内外精品视频| 色综合色综合色综合色综合色综合| 欧美色图激情小说| 国产区在线观看成人精品| 亚洲线精品一区二区三区八戒| 久久国产精品99久久人人澡| 91亚洲国产成人精品一区二三 | bt欧美亚洲午夜电影天堂| 欧美影视一区在线| 欧美精品一区二区三区高清aⅴ | 日韩一区二区三区在线| 中文一区二区在线观看| 亚洲国产成人tv| 国产成人av资源| 7777精品久久久大香线蕉| 国产精品乱码一区二区三区软件| 亚洲大片一区二区三区| www.欧美色图| 久久久久国产成人精品亚洲午夜| 亚洲综合久久久久| 99久久久国产精品免费蜜臀|