- 摘要
go語言中goroutine之間的關聯關系,缺乏維護,在erlang中有專門的機制來保障新開仟程的生命周期,
在go語言中,只能通過channel + select來實現,但不夠直觀,感覺很繞。
Context 通常被譯作 上下文 ,它是一個比較抽象的概念。在公司技術討論時也經常會提到 上下文 。一般理解為程序單元的一個運行狀態、現場、快照,而翻譯中 上下 又很好地詮釋了其本質,上下上下則是存在上下層的傳遞, 上 會把內容傳遞給 下 。在Go語言中,程序單元也就指的是Goroutine。
context 包不僅實現了在程序單元之間共享狀態變量的方法,同時能通過簡單的方法,使我們在被調用程序單元的外部,通過設置ctx變量值,將過期或撤銷這些信號傳遞給被調用的程序單元。
- 源碼剖析
context包的接口
// context 包里的方法是線程安全的,可以被多個 goroutine 使用
type Context interface {
// 當Context 被 canceled 或是 times out 的時候,Done 返回一個被 closed 的channel
Done() <-chan struct{}
// 在 Done 的 channel被closed 后, Err 代表被關閉的原因
Err() error
// 如果存在,Deadline 返回Context將要關閉的時間
Deadline() (deadline time.Time, ok bool)
// 如果存在,Value 返回與 key 相關了的值,不存在返回 nil
Value(key interface{}) interface{}
}
我們不需要手動實現這個接口,context 包已經給我們提供了兩個,一個是 Background(),一個是 TODO(),這兩個函數都會返回一個 Context 的實例。只是返回的這兩個實例都是空 Context。
