Go的context
context.Context
context.Context
一般用于并發(fā)控制。context
是一個接口包含四個方法。
type context interface {
? ?
????Deadline() (deadline time.time, ok bool)
? ?
????Done() <- struct{}
? ?
????Err() error
? ?
????Value(key any) any?
}
Deadline的第一個返回值表示還有多久就到期,第二個返回值表示是否到期。
Done方法是使用的最頻繁的一個方法,它返回一個chan。通常的做法是監(jiān)聽這個chan,如果收到信號則表示chan已經(jīng)關閉,需要執(zhí)行退出,如果chan已經(jīng)關閉,則Err()返回退出的原因。
Value()方法返回指定的key對應的value,這是通過context攜帶的值,一般用在跨程序的API中,值的作用域在結(jié)束時停止。key必須是訪問安全的,因為可能涉及到多個goroutine同時訪問。一般常見的策略是在
context
中存儲授權相關的值。主要用于安全憑證,分布式ID追蹤,操作優(yōu)先級,退出信息號以及到期時間等場景。
context常見的具體實現(xiàn)
context
是一個接口,這就需要具體的實現(xiàn)。context.Background
函數(shù)一般用作于根對象的存在,不可以退出,不可以攜帶值。
需要具體的使用context
的功能,就需要派生出新的context
。
用于退出的函數(shù):
func WithCancel(parent Context) (ctx Context, cancel CancelFunc)
func WithTimeOut(parent Context, timeout time.Duration) (Context, CancelFunc)
func WithDeadline(parent Context, d time.Time) (Context, CancelFunc)
func WithValue(parent Context, key, val any) Context
WithCancel
函數(shù)返回一個子context
并且包含cancel
退出方法。子context
在兩種情況下會退出:一種是調(diào)用
cancel
;另一種是當參數(shù)中父
context
退出時,該context
及其衍生的子context
都會全部退出。WithTimeout
函數(shù)指定一個超時時間,當超時發(fā)生時,子context
將會退出。因此子context
退出有三種情況:父
context
退出超時退出
主動調(diào)用
cancel
函數(shù)退出WithDeadline
函數(shù)與WithTimeOut
類似,前者指定的截止日期,后者指定的時間段。WithValue
函數(shù)返回帶key-value
的子context
。
Context的原理
context
在很大程度上利用了chan在close時會通知所有監(jiān)聽的它的goroutine這個特性實現(xiàn)的。