国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Golang中Context包使用場景和示例詳解

開發(fā) 前端
Context包提供了一種機制,可以在多個Goroutine之間進行通信和控制。使用Context包能夠有效地控制程序的并發(fā)性,提高程序的健壯性和性能。

本文結(jié)合示例代碼講解一下context包的幾種使用場景。

控制子協(xié)程退出

context包提供了一種機制,可以在多個goroutine之間進行通信和控制。使用Context包能夠有效地控制程序的并發(fā)性,提高程序的健壯性和性能。

Golang是沒有辦法讓其他goroutine退出的,goroutine只能自己退出。之所以說context包可以控制子協(xié)程退出意思是子協(xié)程可以接收到主協(xié)程發(fā)出的退出信號,然后自己退出。看如下示例代碼:

package main

import (
	"context"
	"errors"
	"sync"
)

func request(ctx context.Context, url string) error {
	result := make(chan int)
	err := make(chan error)
	go func() {
		// 假如isSuccess是請求返回的結(jié)果,成功則通過result傳遞成功信息,錯誤通過error傳遞錯誤信息
		isSuccess := true
		if isSuccess {
			result <- 1
		} else {
			err <- errors.New("some error happen")
		}
	}()

	select {
	case <-ctx.Done():
		// 其他請求失敗
		return ctx.Err()
	case e := <-err:
		// 本次請求失敗,返回錯誤信息
		return e
	case <-result:
		// 本此請求成功,不返回錯誤信息
		return nil
	}
}

func main() {
	ctx, cancel := context.WithCancel(context.Background())
	// 調(diào)用接口a
	err := request(ctx, "https://xxx.com/a")
	if err != nil {
		return
	}
	wg := sync.WaitGroup{}
	// 調(diào)用接口b
	wg.Add(1)
	go func() {
		defer wg.Done()
		err := request(ctx, "https://xxx.com/b")
		if err != nil {
			cancel()
		}
	}()
	// 調(diào)用接口c
	wg.Add(1)
	go func() {
		defer wg.Done()
		err := request(ctx, "https://xxx.com/c")
		if err != nil {
			cancel()
		}
	}()
	wg.Wait()
}

首先調(diào)用context.WithCancel方法構(gòu)造了一個Context和返回了一個cancel函數(shù),其他goroutine調(diào)用的方法都傳入了這個Context作為第一個參數(shù),當主goroutine想要告訴所有g(shù)oroutine需要退出的時候,通過調(diào)用cancel函數(shù)把退出的信息告訴所有的goroutine。所有g(shù)oroutine通過監(jiān)聽ctx.Done返回的channel得到退出信號然后退出。

超時控制

例如查詢數(shù)據(jù)庫、調(diào)用RPC服務(wù)、調(diào)用HTTP接口等場景,這些操作都是阻塞的,如果一直不返回數(shù)據(jù)的話,會影響產(chǎn)品的用戶體驗。針對這些情況的解決方式通常是設(shè)置一個超時間,超過后自動取消操作。

使用context包中的WithDeadline和WithTimeout方法可以實現(xiàn)這個解決方法。先看如下例子:

package main

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

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)
    defer cancel()

    select {
    case <-time.After(1 * time.Second):
        fmt.Println("overslept")
    case <-ctx.Done():
        fmt.Println(ctx.Err()) // 輸出 "context deadline exceeded"
    }
}

因為設(shè)置的超時時間是50毫秒,所以select會進入第二個case,會輸出“context deadline exceeded”。

Golang的net/http包發(fā)起http請求的時候是實現(xiàn)了超時控制的,看如下代碼:

package main

import (
	"context"
	"io"
	"log"
	"net/http"
	"time"
)

func main() {
	req, err := http.NewRequest(http.MethodGet, "https://www.baidu.com", nil)
	if err != nil {
		log.Fatal(err)
	}

	// 構(gòu)造一個超時間為50毫秒的Context
	ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)
	defer cancel()
	req = req.WithContext(ctx)
	
	c := &http.Client{}
	res, err := c.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer res.Body.Close()
	out, err := io.ReadAll(res.Body)
	if err != nil {
		log.Fatal(err)
	}
	log.Println(string(out))
}

執(zhí)行后會輸出“context deadline exceeded”,如果將context.WithTimeout方法的timeout參數(shù)調(diào)大一些,就可以看到正常的返回數(shù)據(jù)。

上下文傳遞數(shù)據(jù)

這個作用在鏈路追蹤中非常重要,鏈路追蹤需要將traceID層層往下傳遞,在服務(wù)間傳遞。

type traceIdKey struct{}{}

// 定義固定的Key
var TraceIdKey = traceIdKey{}

func ServeHTTP(w http.ResponseWriter, req *http.Request){
  // 首先從請求中獲取到traceID
  traceId := getTraceIdFromRequest(req)
  // 將Key存入Context中
  ctx := context.WithValue(req.Context(), TraceIdKey, traceId)
  // 設(shè)置超時時間
  ctx = context.WithTimeout(ctx, time.Second)
  // 攜帶traceId發(fā)起rpc請求
  repResp := RequestRPC(ctx, ...)
  // 攜帶traceId查詢DB
  dbResp := RequestDB(ctx, ...)
  // ...
}

func RequestRPC(ctx context.Context, ...) interface{} {
    // 獲取traceid,在調(diào)用rpc時記錄日志
    traceId, _ := ctx.Value(TraceIdKey)
    // 發(fā)起請求

    // ...
    return
}

接收到請求后,通過req獲取到traceId并記錄到Context中,在調(diào)用其他RPC服務(wù)和查詢DB時,傳入構(gòu)造的Context。在后續(xù)代碼中,可以通過Context拿到存入的traceId。

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2023-05-12 09:40:53

ContextGolang

2023-11-13 21:55:12

Go編程

2022-02-13 23:10:46

Golang語言變量

2013-12-25 16:03:39

GitGit 命令

2025-04-24 10:40:46

CatalogFlink SQL元數(shù)據(jù)

2024-10-06 12:35:50

2024-04-11 13:41:47

2019-12-30 10:40:31

GPU技術(shù)應(yīng)用

2022-05-07 08:22:34

內(nèi)核BPF代碼

2020-02-12 14:42:00

GPU技術(shù)關(guān)鍵參數(shù)應(yīng)用場景

2023-11-27 15:02:37

BytesGolang

2021-04-28 09:02:48

Golang語言Context

2023-08-03 08:48:07

Golang接口

2023-05-16 07:47:18

RabbitMQ消息隊列系統(tǒng)

2023-10-18 08:22:38

BufioGolang

2023-08-02 09:07:27

Golangio 包

2023-10-24 16:03:34

GoGolang

2021-06-06 23:40:53

線程池使用場景

2024-11-27 08:15:50

2021-04-21 09:21:07

zookeeper集群源碼
點贊
收藏

51CTO技術(shù)棧公眾號

最新国产精品拍自在线播放| 久久免费精品视频| 国产99re| 国产一区二区按摩在线观看| 国产精品免费一区| 美女午夜精品| 九九精品视频在线| 亚洲va中文在线播放免费| 日韩视频一区二区三区在线播放 | 欧美综合在线第二页| 亚洲成人a级片| 91精品美女| 深夜精品寂寞黄网站在线观看| 欧美综合在线视频观看| 欧美三级免费观看| 在线观看免费视频一区二区三区| 91丨porny丨蝌蚪视频| 91传媒免费视频| 麻豆一区二区在线| 亚洲国产精品久久久久婷婷老年 | 亚洲91视频| 国产ts一区二区| 久久97视频| 国产美女久久久| 99国产精品一区二区| 国产欧美一区二区三区在线 | 老鸭窝毛片一区二区三区| 亚洲一二三专区| 老司机精品视频在线观看6| 中文字幕日韩免费视频| 在线的色视频| 91久久精品一区二区| 在线观看免费观看在线91| 欧美视频在线观看 亚洲欧| 日韩一区二区三区中文字幕| 91久久精品一区二区三| 麻豆传媒视频在线| 亚洲成在人线av| 日韩电影大全网站| 久久亚洲国产精品| www.成人| 欧美又大粗又爽又黄大片视频| 麻豆视频一区| 成人精品久久久| 久久福利毛片| 成人在线观看毛片| 91蜜桃视频在线| av三级影院| 欧美专区日韩专区| 在线看片福利| 久久综合九色九九| 精品一区二区三| 久久久婷婷一区二区三区不卡| 美国三级日本三级久久99| 日本男女交配视频| 亚洲人成精品久久久久| 国产精品无码永久免费888| 国产精品igao激情视频| 国产wwwxx| 欧美伊人久久大香线蕉综合69| 黑人巨大国产9丨视频| 一道本一区二区三区| 久久精品小视频| 色网在线观看| 日本高清xxxx| 激情综合一区二区三区| 热久久精品国产| 色天使久久综合网天天| 超碰在线视屏| 欧美中文字幕在线观看| 亚洲在线一区| 成人直播大秀| 奇米影视首页 狠狠色丁香婷婷久久综合| 天堂av在线一区| 日日碰狠狠添天天爽超碰97| 成人在线视频一区二区| 尤物网在线观看| 国产免费一区视频观看免费 | 黄色在线看片| 日本一区二区免费看| 国产视频一区在线| 国产一区二区免费在线| 国产在线88av| 亚洲成人福利在线观看| 国产精品黄页免费高清在线观看| av一区二区不卡| 搞黄视频免费在线观看| 国产午夜精品一区二区三区| 欧美91在线| 成人黄视频免费| 色婷婷av一区二区三区软件| 成人精品国产亚洲| 香蕉久久一区二区不卡无毒影院| 亚洲天堂av影院| 国产伦精品一区二区三区视频孕妇| 国产91精品入口| 欧美被日视频| 国产精品久久av| 久久综合资源网| 黄色污网站在线观看| 91av免费看| 亚洲一区二区在线观看视频 | 波多野结衣三级在线| 色欧美片视频在线观看在线视频| 国产精品久久久久av蜜臀| 久久免费一级片| 日韩一区二区视频| 欧美暴力喷水在线| 天堂影视av| 欧美极品少妇xxxxⅹ喷水| 国产精品资源网| 女囚岛在线观看| 久久riav二区三区| 91国产丝袜在线播放| 成人高清av| 免费看美女隐私的视频| 97精品国产97久久久久久春色| 久久综合九色综合欧美98| 日韩成人亚洲| 欧美又粗又长又爽做受| 亚洲天堂视频在线观看| 久久精品国产亚洲a| 麻豆视频在线看| 男女激烈动态图| 亚洲欧美一区二区三区久久 | 亚洲精品久久久久久久久久久久| 自拍视频亚洲| 最近高清中文在线字幕在线观看1| 亚洲在线观看视频| 亚洲综合精品一区二区| 日韩欧美精品一区二区| 色偷偷88欧美精品久久久| 欧美精品1区| 日韩久久精品一区| 亚洲国产精品精华素| 免费在线观看91| 国产经品一区二区| 欧美裸体网站| 777久久精品一区二区三区无码 | 国产人久久人人人人爽| 久久蜜桃一区二区| 中文字幕一区二区不卡| 欧美性色xo影院| 精品国产人成亚洲区| 色偷偷噜噜噜亚洲男人的天堂| 久久九九国产精品怡红院| 97超级碰碰碰| 国产精品免费一区二区三区在线观看 | 中国丰满人妻videoshd | 精品免费在线视频| 欧美高清hd18日本| 在线观看91精品国产入口| 国产乱理伦片a级在线观看| 999在线免费观看视频| 国产区二精品视| 黄色一级视频片| 精品乱码一区二区三四区视频 | 日韩精品中文字幕久久臀| 欧美激情在线一区| 欧美日韩高清免费| 亚洲jizzjizz妇女| 尤物视频在线看| 残酷重口调教一区二区| 国产精品99久久久久久有的能看| 亚洲午夜在线观看视频在线| 亚洲爱爱爱爱爱| 91久久久久久久久久久久久| 免费看的黄色大片| 色av手机在线| 午夜久久影院| 亚洲精品免费在线| 自拍偷拍亚洲在线| 神马影院午夜我不卡| 麻豆app在线观看| 色婷婷狠狠五月综合天色拍| 成人免费高清在线| 亚洲国产成人精品电影| 国产伦精品一区二区三区在线| 成人拍拍拍在线观看| av在线播放一区二区| 狠狠久久亚洲欧美| 日韩国产网站| 亚洲热app| 巨胸喷奶水www久久久| 国产日韩视频| 亚洲精品成a人| 亚洲精品中文字幕有码专区| 欧美制服丝袜第一页| 欧美日韩国产电影| 日韩欧美中文字幕公布| 亚洲女与黑人做爰| 欧美丰满美乳xxx高潮www| 日韩欧美国产一区二区三区| 一二三四社区欧美黄| 亚洲国产精品av| 国产精品18久久久久久久久| 精品一区二区三区香蕉蜜桃 | 亚洲国产成人在线| 色综合久久中文综合久久牛| 精品少妇一区二区30p|