Go 中的上下文提供了一種機制來傳遞任意值以及請求並追蹤取消。預設情況下,所有上下文共享相同的取消機制。但是,某些場景可能需要將上下文傳播與取消解耦。
考慮一個在請求生命週期之外執行任務的 HTTP 處理程序。回傳回應後,處理程序可以在 goroutine 中啟動非同步任務。此任務可能需要存取上下文值,但如果原始請求上下文被取消,則不得終止。
Go 1.21 中引入了WithoutCancel,提供了一種簡單的方法建立非取消上下文。使用此方法,我們可以獲得原始上下文的副本,其中包含其所有儲存值,但與其取消狀態無關。
在 Go 1.21 之前,自訂非取消上下文的實作是必要的。關鍵是建立一個滿足context.Context 介面的類型並重寫以下方法以防止取消:
此外,實作必須儲存原始上下文並委託 Value() 呼叫來檢索儲存的值。
import ( "context" "github.com/mypackage/mycontext" ) func Handler(ctx context.Context) (interface{}, error) { result := doStuff(ctx) newContext := mycontext.WithoutCancel(ctx) go func() { doSomethingElse(newContext) }() return result }
透過理解非取消上下文背後的原理利用可用的工具,開發人員可以創建自訂解決方案或利用Go 的內建功能來實現所需的上下文傳播而無需取消。
以上是如何在沒有取消傳播的情況下使用 Go 中的上下文?的詳細內容。更多資訊請關注PHP中文網其他相關文章!