Go語言中的context包提供了一種在多個goroutine之間傳遞取消信號攒射、超時和截止時間的機(jī)制晶姊。它是在處理需要跟蹤或取消操作的并發(fā)程序時非常有用的工具猿妈。下面是context包的一些常見用法示例:
1, 創(chuàng)建一個context.Context:
使用context.Background()函數(shù)創(chuàng)建一個基礎(chǔ)的Context芬失,它通常用于頂層的goroutine,沒有父Context附迷。
ctx := context.Background()
2,創(chuàng)建一個帶有超時的Context:
使用context.WithTimeout()函數(shù)創(chuàng)建一個在指定時間后自動取消的Context惧互。
import (
"context"
"time"
)
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel() // 在完成操作后取消Context
3, 創(chuàng)建一個帶有截止時間的Context:
使用context.WithDeadline()函數(shù)創(chuàng)建一個在指定截止時間后自動取消的。
Copy code
import (
"context"
"time"
)
deadline := time.Now().Add(10 * time.Second)
ctx, cancel := context.WithDeadline(context.Background(), deadline)
defer cancel() // 在完成操作后取消Context
4, 創(chuàng)建一個可以手動取消的Context:
使用context.WithCancel()函數(shù)創(chuàng)建一個可以手動取消的Context喇伯,通常用于外部觸發(fā)取消操作喊儡。
import "context"
ctx, cancel := context.WithCancel(context.Background())
// 在需要取消時調(diào)用cancel函數(shù)
cancel()
5, 從Context中獲取取消信號:
通過ctx.Done()通道來獲取取消信號,當(dāng)Context被取消或超時時稻据,這個通道會被關(guān)閉艾猜。
select {
case <-ctx.Done():
// 處理取消信號或超時
}
6, 在goroutine中使用Context:
將Context傳遞給goroutine,以便它們能夠接收取消信號或超時信號捻悯。
go func(ctx context.Context) {
for {
select {
case <-ctx.Done():
// 處理取消信號或超時
return
default:
// 執(zhí)行正常操作
}
}
}(ctx)
7, 創(chuàng)建一個設(shè)置鍵值對的Context
使用context.WithValue函數(shù)將自定義的鍵值對添加到Context中匆赃,以便在整個Context樹中傳遞和檢索這些值。
package main
import (
"context"
"fmt"
)
// 定義一個自定義的上下文鍵類型
type keyType string
func main() {
// 創(chuàng)建一個帶有自定義鍵值對的Context
ctx := context.WithValue(context.Background(), keyType("UserID"), "12345")
// 在不同部分的代碼中檢索自定義鍵值對
userID, ok := ctx.Value(keyType("UserID")).(string)
if ok {
fmt.Printf("UserID: %s\n", userID)
} else {
fmt.Println("UserID 未找到")
}
}
context.WithValue函數(shù)用于傳遞與上下文相關(guān)的數(shù)據(jù)今缚,但請謹(jǐn)慎使用它算柳,因為它不提供任何鎖定或同步功能,因此不適合用于在并發(fā)環(huán)境中頻繁更改數(shù)據(jù)姓言。如果需要在多個goroutine之間共享數(shù)據(jù)瞬项,應(yīng)使用更適合并發(fā)操作的數(shù)據(jù)結(jié)構(gòu)和同步機(jī)制。
總結(jié)
這些是context包的一些常見用法示例事期。使用context可以有效地管理goroutine之間的并發(fā)操作滥壕,并允許你在需要時安全地取消它們纸颜。