首頁 >後端開發 >Golang >如何在不取消傳播的情況下克隆 Go 上下文?

如何在不取消傳播的情況下克隆 Go 上下文?

Linda Hamilton
Linda Hamilton原創
2024-11-08 14:17:02604瀏覽

How to Clone a Go Context Without Cancel Propagation?

如何在不取消傳播的情況下克隆 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中文網其他相關文章!

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