首頁 >後端開發 >Golang >golang context用來幹嗎

golang context用來幹嗎

(*-*)浩
(*-*)浩原創
2019-12-03 09:52:453094瀏覽

golang context用來幹嗎

context在Go1.7之後就進入標準庫中了。它主要的用處如果用一句話來說,是在於控制goroutine的生命週期。當一個計算任務被goroutine承接了之後,由於某種原因(超時,或者強制退出)我們希望中止這個goroutine的計算任務,那麼就用得到這個Context了。              (建議學習:go

對 Golang 開發者來說context(上下文)套件一定不會陌生。但很多時候,我們懶惰的只是見過它,或能起到什麼作用,並不會去深究它。

應用場景:在 Go http 套件的 Server 中,每一個請求在都有一個對應的goroutine去處理。

請求處理函數通常會啟動額外的goroutine用來存取後端服務,例如資料庫和 RPC 服務。

用來處理一個請求的goroutine通常需要存取一些與請求特定的數據,例如終端使用者的身份認證資訊、驗證相關的 token、請求的截止時間。

當一個請求被取消或逾時時,所有用來處理該請求的goroutine都應該迅速退出,然後系統才能釋放這些goroutine所佔用的資源

Context 原理

Context 的呼叫應該是鍊式的,透過WithCancel,WithDeadline,WithTimeout或WithValue衍生出新的Context。當父 Context 被取消時,其派生的所有 Context 都會取消。

透過context.WithXXX都將傳回新的 Context 和 CancelFunc。呼叫 CancelFunc 將取消子代,移除父代對子代的引用,並且停止所有定時器。未能呼叫 CancelFunc 將洩漏子代,直到父代被取消或定時器觸發。 go vet工具檢查所有流程控制路徑上使用 CancelFuncs。

遵循規則

遵循以下規則,以保持套件之間的介面一致,並啟用靜態分析工具以檢查上下文傳播。

不要將 Contexts 放入結構體,相反context應該作為第一個參數傳入,命名為ctx。 func DoSomething(ctx context.Context,arg Arg)error { // ... use ctx ... }

即使函數允許,也不要傳入nil的 Context。如果不知道要用哪一種 Context,可以使用context.TODO()。

使用context的Value相關方法只應該用於在程式和介面中傳遞的和請求相關的元數據,不要用它來傳遞一些可選的參數

相同的Context 可以傳遞給在不同的goroutine;Context 是並發安全的。

以上是golang context用來幹嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn