首頁  >  文章  >  後端開發  >  如何在 Go 中建立一個不會取消的上下文?

如何在 Go 中建立一個不會取消的上下文?

Barbara Streisand
Barbara Streisand原創
2024-11-09 06:00:03747瀏覽

How to Create a Context in Go that Doesn't Cancel?

規避上下文取消傳播

Go 中的上下文管理提供了一種在應用程式的不同部分之間傳遞資料並處理取消的方法。然而,當您需要一個繼承原始資料但不受取消影響的上下文時,就會出現挑戰。

為了滿足這一需求,Go 1.21 在 context 套件中引入了 WithoutCancel 方法,它滿足了這一要求。

或者,如果您使用的是早期版本的 Go,您可以創建自己的上下文實現,該實現是專門為防止取消而設計的。操作方法如下:

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) }

// WithoutCancel returns a context that is never canceled.
func WithoutCancel(ctx context.Context) context.Context {
    return noCancel{ctx: ctx}
}

透過此自訂上下文實現,您可以獲得原始上下文的副本:

  • 繼承原始上下文中儲存的所有值。
  • 即使在原始上下文取消後仍保持活動狀態。

這種方法允許您在單獨的 goroutine 中執行非同步任務,即使在父上下文終止時也確保它們的執行。

以上是如何在 Go 中建立一個不會取消的上下文?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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