golang中context包學習


 

  • 摘要

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。

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM