如何在不取消傳播的情況下克隆 Go 上下文
在 Go 程式語言中,上下文。上下文在函數之間攜帶元資料和取消訊號和 goroutine。但是,可能需要建立保留相同值但不繼承原始取消狀態的上下文副本。
使用案例:
當HTTP 請求的上下文在將回應傳回給客戶端後被取消時,就會出現這種情況,但您需要在單獨的goroutine 中執行非同步任務,該任務可能會比父上下文的壽命更長。
解:
1。建立自訂上下文實作:
在 Go 1.21 之前,一種方法是建立自己的上下文。永遠不會取消的上下文實作:
import ( "context" "time" ) type noCancel struct { ctx context.Context } func (c noCancel) Deadline() (time.Time, bool) { return time.Time{}, false } func (c noCancel) Done() <-chan struct{} { return nil } func (c noCancel) Err() error { return nil } func (c noCancel) Value(key interface{}) interface{} { return c.ctx.Value(key) }
然後,您可以建立使用此實作的新上下文:
ctxWithoutCancel := WithoutCancel(ctx)
2。使用WithoutCancel 函數(Go 1.21 ):
從Go 1.21 開始,上下文套件包含一個WithoutCancel 函數來簡化此過程:
ctxWithoutCancel := context.WithoutCancel(ctx)
該函數傳回一個新的上下文,與原始上下文共享相同的值,但不會被取消。
範例:
func Handler(ctx context.Context) (interface{}, error) { result := doStuff(ctx) newContext := context.WithoutCancel(ctx) go func() { doSomethingElse(newContext) }() return result }
這樣,即使在請求上下文之後,doSomethingElse也會繼續運作已取消。
以上是如何在不取消傳播的情況下克隆 Go 上下文?的詳細內容。更多資訊請關注PHP中文網其他相關文章!