日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 知識百科

細數 Context 使用場景

來源: 責編: 時間:2023-08-07 16:29:55 302觀看
導讀 你好,我是四哥。前一篇文章從源碼的角度詳細介紹了 Context 的實現原理,但是還沒有提到 Context 的使用場景,今天我們一起來看下:1.請求鏈路傳值。傳值使用方式如下:func func1(c

你好,我是四哥。I0328資訊網——每日最新資訊28at.com

前一篇文章從源碼的角度詳細介紹了 Context 的實現原理,但是還沒有提到 Context 的使用場景,今天我們一起來看下:I0328資訊網——每日最新資訊28at.com

1.請求鏈路傳值。I0328資訊網——每日最新資訊28at.com

傳值使用方式如下:I0328資訊網——每日最新資訊28at.com

func func1(ctx context.Context) {I0328資訊網——每日最新資訊28at.com
ctx = context.WithValue(ctx, "k1", "v1")I0328資訊網——每日最新資訊28at.com
func2(ctx)I0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com
I0328資訊網——每日最新資訊28at.com
func func2(ctx context.Context) {I0328資訊網——每日最新資訊28at.com
fmt.Println("func2:",ctx.Value("k1").(string))I0328資訊網——每日最新資訊28at.com
ctx = context.WithValue(ctx, "k2", "v2")I0328資訊網——每日最新資訊28at.com
func3(ctx)I0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com
I0328資訊網——每日最新資訊28at.com
func func3(ctx context.Context) {I0328資訊網——每日最新資訊28at.com
fmt.Println("func3:",ctx.Value("k1").(string))I0328資訊網——每日最新資訊28at.com
fmt.Println("func3:",ctx.Value("k2").(string))I0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com
I0328資訊網——每日最新資訊28at.com
func main() {I0328資訊網——每日最新資訊28at.com
ctx := context.Background()I0328資訊網——每日最新資訊28at.com
func1(ctx)I0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com

我們在 func1() 通過函數 WithValue() 設置了一個鍵值對 k1-v1,在 func2() 可以獲取到 func1() 設置的鍵值對,如果調用 func3() 時把這個 ctx 繼續傳入的話,在 func3() 中依然還是可以獲取到 k1-v1。I0328資訊網——每日最新資訊28at.com

但是在 func1() 中獲取不到 func2() 設置的鍵值對 k2-v2,因為 context 只能自上而下攜帶值,這點需要注意。I0328資訊網——每日最新資訊28at.com

2.取消耗時操作,及時釋放資源。I0328資訊網——每日最新資訊28at.com

使用 channel + select 的機制:I0328資訊網——每日最新資訊28at.com

func func1() error {I0328資訊網——每日最新資訊28at.com
respC := make(chan int) // 起消息通知作用I0328資訊網——每日最新資訊28at.com
// 處理邏輯I0328資訊網——每日最新資訊28at.com
go func() {I0328資訊網——每日最新資訊28at.com
time.Sleep(time.Second * 3) // 模擬處理業務邏輯I0328資訊網——每日最新資訊28at.com
respC close(respC)I0328資訊網——每日最新資訊28at.com
}()I0328資訊網——每日最新資訊28at.com
I0328資訊網——每日最新資訊28at.com
// 判斷是否超時I0328資訊網——每日最新資訊28at.com
select {I0328資訊網——每日最新資訊28at.com
case r := <-respC:I0328資訊網——每日最新資訊28at.com
fmt.Printf("Resp: %d ", r)I0328資訊網——每日最新資訊28at.com
return nilI0328資訊網——每日最新資訊28at.com
case <-time.After(time.Second * 2): // 超過設置的時間就報錯I0328資訊網——每日最新資訊28at.com
fmt.Println("catch timeout")I0328資訊網——每日最新資訊28at.com
return errors.New("timeout")I0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com
I0328資訊網——每日最新資訊28at.com
func main() {I0328資訊網——每日最新資訊28at.com
err := func1()I0328資訊網——每日最新資訊28at.com
fmt.Printf("func1 error: %v ", err)I0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com

上面的方式平時也會用到,通過 context 怎么實現呢?I0328資訊網——每日最新資訊28at.com

下面來看下如何使用 context 進行主動取消、超時取消。I0328資訊網——每日最新資訊28at.com

主動取消:I0328資訊網——每日最新資訊28at.com

func func1(ctx context.Context, wg *sync.WaitGroup) error {I0328資訊網——每日最新資訊28at.com
defer wg.Done()I0328資訊網——每日最新資訊28at.com
respC := make(chan int)I0328資訊網——每日最新資訊28at.com
go func() {I0328資訊網——每日最新資訊28at.com
time.Sleep(time.Second * 5) // 模擬業務邏輯處理I0328資訊網——每日最新資訊28at.com
respC }()I0328資訊網——每日最新資訊28at.com
// 取消機制I0328資訊網——每日最新資訊28at.com
select {I0328資訊網——每日最新資訊28at.com
case <-ctx.Done():I0328資訊網——每日最新資訊28at.com
fmt.Println("cancel")I0328資訊網——每日最新資訊28at.com
return errors.New("cancel")I0328資訊網——每日最新資訊28at.com
case r := <-respC:I0328資訊網——每日最新資訊28at.com
fmt.Println(r)I0328資訊網——每日最新資訊28at.com
return nilI0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com
I0328資訊網——每日最新資訊28at.com
func main() {I0328資訊網——每日最新資訊28at.com
wg := &sync.WaitGroup{}I0328資訊網——每日最新資訊28at.com
ctx, cancel := context.WithCancel(context.Background())I0328資訊網——每日最新資訊28at.com
wg.Add(1)I0328資訊網——每日最新資訊28at.com
go func1(ctx, wg)I0328資訊網——每日最新資訊28at.com
time.Sleep(time.Second * 2)I0328資訊網——每日最新資訊28at.com
cancel() // 主動取消I0328資訊網——每日最新資訊28at.com
wg.Wait() // 等待 goroutine 退出I0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com

超時取消:I0328資訊網——每日最新資訊28at.com

func func1(ctx context.Context) {I0328資訊網——每日最新資訊28at.com
resp := make(chan int)I0328資訊網——每日最新資訊28at.com
go func() {I0328資訊網——每日最新資訊28at.com
time.Sleep(time.Second * 5) // 模擬處理邏輯I0328資訊網——每日最新資訊28at.com
resp }()I0328資訊網——每日最新資訊28at.com
// 超時機制I0328資訊網——每日最新資訊28at.com
select {I0328資訊網——每日最新資訊28at.com
case <-ctx.Done():I0328資訊網——每日最新資訊28at.com
fmt.Println("ctx timeout")I0328資訊網——每日最新資訊28at.com
fmt.Println(ctx.Err())I0328資訊網——每日最新資訊28at.com
case <-resp:I0328資訊網——每日最新資訊28at.com
fmt.Println("done")I0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com
returnI0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com
func main() {I0328資訊網——每日最新資訊28at.com
ctx, cancel := context.WithTimeout(context.Background(), time.Second*2)I0328資訊網——每日最新資訊28at.com
defer cancel()I0328資訊網——每日最新資訊28at.com
func1(ctx)I0328資訊網——每日最新資訊28at.com
}3.防止 goroutine 泄露。I0328資訊網——每日最新資訊28at.com

引自【深度解密 Go 語言之 context[1]】I0328資訊網——每日最新資訊28at.com

func gen() ch := make(chan int)I0328資訊網——每日最新資訊28at.com
go func() {I0328資訊網——每日最新資訊28at.com
var n intI0328資訊網——每日最新資訊28at.com
for {I0328資訊網——每日最新資訊28at.com
ch n++I0328資訊網——每日最新資訊28at.com
time.Sleep(time.Second)I0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com
}()I0328資訊網——每日最新資訊28at.com
return chI0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com

這是一個可以生成無限整數的協程,但如果我只需要它產生的前 5 個數,那么就會發生 goroutine 泄漏:I0328資訊網——每日最新資訊28at.com

func main() {I0328資訊網——每日最新資訊28at.com
for n := range gen() {I0328資訊網——每日最新資訊28at.com
fmt.Println(n)I0328資訊網——每日最新資訊28at.com
if n == 5 {I0328資訊網——每日最新資訊28at.com
breakI0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com
// ……I0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com

當 n == 5 的時候,直接 break 掉。那么 gen 函數的協程就會執行無限循環,永遠不會停下來。發生了 goroutine 泄漏。I0328資訊網——每日最新資訊28at.com

用 context 改進這個例子:I0328資訊網——每日最新資訊28at.com

func gen(ctx context.Context) ch := make(chan int)I0328資訊網——每日最新資訊28at.com
go func() {I0328資訊網——每日最新資訊28at.com
var n intI0328資訊網——每日最新資訊28at.com
for {I0328資訊網——每日最新資訊28at.com
select {I0328資訊網——每日最新資訊28at.com
case <-ctx.Done():I0328資訊網——每日最新資訊28at.com
returnI0328資訊網——每日最新資訊28at.com
case ch n++I0328資訊網——每日最新資訊28at.com
time.Sleep(time.Second)I0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com
}()I0328資訊網——每日最新資訊28at.com
return chI0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com
I0328資訊網——每日最新資訊28at.com
func main() {I0328資訊網——每日最新資訊28at.com
ctx, cancel := context.WithCancel(context.Background())I0328資訊網——每日最新資訊28at.com
defer cancel() // 避免其他地方忘記 cancel,且重復調用不影響I0328資訊網——每日最新資訊28at.com
I0328資訊網——每日最新資訊28at.com
for n := range gen(ctx) {I0328資訊網——每日最新資訊28at.com
fmt.Println(n)I0328資訊網——每日最新資訊28at.com
if n == 5 {I0328資訊網——每日最新資訊28at.com
cancel()I0328資訊網——每日最新資訊28at.com
breakI0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com
// ……I0328資訊網——每日最新資訊28at.com
}I0328資訊網——每日最新資訊28at.com

增加一個 context,在 break 前調用 cancel 函數,取消 goroutine。gen 函數在接收到取消信號后,直接退出,系統回收資源。I0328資訊網——每日最新資訊28at.com

總結I0328資訊網——每日最新資訊28at.com

這篇文章列出的幾個例子是 context 最基本的使用場景,其他框架、第三包基本上都是從這幾種用法擴展的,所以非常有必要掌握基礎用法。I0328資訊網——每日最新資訊28at.com

另外希望這篇文章能給你帶來幫助,如果文中有理解錯誤之處或者你還想到其他用法,可以在留言區留言,一定回復!抱團學習不孤單!I0328資訊網——每日最新資訊28at.com

參考資料I0328資訊網——每日最新資訊28at.com

[1]深度解密Go語言之context: https://qcrao.com/2019/06/12/dive-into-go-context/I0328資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-119-2167-0.html細數 Context 使用場景

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 云計算開發:Python3-isdecimal()方法詳解

下一篇: 數據分析八大模型:漏斗模型

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久亚洲午夜电影| 91久久精品国产91性色| 欧美激情精品久久久久久变态| 欧美不卡三区| 欧美视频在线不卡| 国产精品亚洲美女av网站| 国产一区二区看久久| 在线国产精品播放| 一片黄亚洲嫩模| 欧美午夜一区二区| 国产精品无码专区在线观看| 国产日韩欧美中文在线播放| 亚洲第一区中文99精品| 日韩午夜在线电影| 亚洲欧美高清| 久久久午夜电影| 欧美理论电影在线播放| 国产精品美女久久久久av超清| 国产一区久久久| 亚洲精品色图| 亚洲综合色视频| 久热精品在线| 欧美日韩在线观看一区二区| 国产人成精品一区二区三| 亚洲黄色片网站| 亚洲一区二区三区精品视频| 久久久久久久网| 欧美视频网站| 曰韩精品一区二区| 亚洲一区二区三区四区在线观看| 久久精品免费播放| 欧美日韩一区二区三区在线 | 国产欧美日韩一区二区三区| 亚洲第一偷拍| 午夜精品久久久久久99热| 欧美va天堂在线| 国产麻豆日韩| 日韩视频在线免费| 久久久久久久性| 国产精品美女一区二区| 亚洲国产精品女人久久久| 午夜久久久久| 欧美日韩国产黄| 亚洲成人在线观看视频| 午夜精品久久久| 欧美另类极品videosbest最新版本| 国产一区二区三区电影在线观看| 一区二区三区产品免费精品久久75| 久久精品官网| 国产精品美女www爽爽爽| 亚洲精品久久久久久一区二区 | 久久精品理论片| 欧美日韩直播| 亚洲黑丝在线| 久久婷婷麻豆| 国产人妖伪娘一区91| 在线中文字幕日韩| 欧美精品激情blacked18| 精品动漫3d一区二区三区| 先锋影音国产精品| 欧美天天视频| 日韩一级黄色片| 美女视频黄 久久| 国产一区91| 午夜视频在线观看一区二区| 欧美日韩一区二区三区四区五区 | 国产精品有限公司| 亚洲午夜av在线| 欧美日韩四区| 日韩一级黄色av| 欧美福利在线观看| 亚洲国产成人精品女人久久久 | 欧美在线影院在线视频| 国产精品日韩久久久久| 一区二区动漫| 欧美日韩不卡一区| 亚洲欧洲日本专区| 欧美成人精品激情在线观看| 亚洲成人在线免费| 蜜月aⅴ免费一区二区三区| 国模精品娜娜一二三区| 欧美一区二区三区免费视| 国产精品揄拍500视频| 亚洲欧美精品在线观看| 欧美午夜免费电影| 亚洲一区二区三区影院| 欧美性大战久久久久久久蜜臀| 一区二区av在线| 欧美三级电影大全| 亚洲一区二区网站| 国产精品一区二区久久国产| 午夜精品久久久久久久99樱桃 | 欧美激情网站在线观看| 日韩视频免费观看高清在线视频 | 亚洲国产日韩一区| 欧美激情视频给我| 一区二区三区精品视频在线观看| 欧美午夜理伦三级在线观看| 亚洲自拍另类| 国产日韩欧美另类| 久久天天综合| 亚洲精品久久久久中文字幕欢迎你 | 伊人久久大香线蕉综合热线| 蜜桃久久av一区| 亚洲精品一区二区三区蜜桃久| 欧美日本中文字幕| 亚洲一区二区三区四区中文| 国产精品综合色区在线观看| 欧美在线观看视频一区二区| 黄色日韩网站视频| 欧美成人一品| 一区二区三区日韩在线观看| 国产精品羞羞答答| 久久久久久久综合日本| 亚洲人成久久| 国产精品va在线播放| 欧美一区二区三区日韩| 曰韩精品一区二区| 欧美日韩精品一区二区天天拍小说| 亚洲一区3d动漫同人无遮挡| 国产一区二区三区电影在线观看| 欧美成年人网站| 亚洲一区在线视频| 激情久久综艺| 欧美日韩性生活视频| 性色av一区二区三区| 亚洲大黄网站| 欧美日韩在线不卡一区| 久久国产手机看片| 99av国产精品欲麻豆| 国产视频不卡| 欧美黑人一区二区三区| 亚洲欧美日韩一区在线| 亚洲成色精品| 国产精品你懂的| 美玉足脚交一区二区三区图片| 国产精品99久久99久久久二8| 国模吧视频一区| 欧美日韩一区国产| 久久精品一区二区国产| 日韩视频亚洲视频| 国产视频在线观看一区| 欧美激情精品久久久久久蜜臀| 亚洲欧美日韩国产一区| 久久蜜桃av一区精品变态类天堂| 亚洲三级影片| 国产欧美一区二区三区在线老狼| 欧美成年人视频| 欧美影院在线| 99成人在线| 一区二区三区我不卡| 欧美系列精品| 欧美成年人视频| 久久大综合网| 中日韩视频在线观看| 尤妮丝一区二区裸体视频| 国产精品久久久久毛片大屁完整版| 久久一区二区三区四区五区| 亚洲一区网站| 亚洲乱码国产乱码精品精天堂| 国产亚洲成精品久久| 欧美日韩免费在线观看| 另类酷文…触手系列精品集v1小说| 亚洲免费视频网站| 日韩午夜激情电影| 136国产福利精品导航网址应用| 国产麻豆9l精品三级站| 欧美日韩日韩| 欧美高清视频在线| 久久精品成人一区二区三区| 中文国产一区| 亚洲精品视频在线观看免费| 国内外成人在线| 国产精品一区在线播放| 欧美三级在线| 欧美黄色免费网站| 久久这里有精品视频| 欧美在线91| 亚洲欧美福利一区二区| 一本大道久久精品懂色aⅴ| 在线观看亚洲视频| 国产一区二区三区久久久| 国产精品爽爽ⅴa在线观看| 欧美视频免费| 欧美日韩亚洲一区二区三区在线观看 | 狠狠干综合网| 国产一区二区三区视频在线观看| 国产精品嫩草影院av蜜臀| 欧美日韩一视频区二区| 欧美精品一区二区在线观看| 欧美mv日韩mv国产网站| 久久综合网络一区二区| 久久久97精品| 欧美一区观看| 欧美一区二区三区成人| 亚洲欧美日韩综合aⅴ视频| 中国女人久久久| 一区二区三区视频在线播放| 99re6热只有精品免费观看| 亚洲精品综合精品自拍| 亚洲精品免费在线播放| 亚洲日本aⅴ片在线观看香蕉| 最新成人av在线| 亚洲精品一区二区三区蜜桃久|