首頁 >後端開發 >Golang >如何在 Go 中建立忽略取消的上下文?

如何在 Go 中建立忽略取消的上下文?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-09 14:58:02637瀏覽

How to Create a Context in Go That Ignores Cancellation?

在 Go 中建立沒有取消傳播的上下文

在 Go 中,上下文攜帶與執行相關的訊息,例如截止日期和取消令牌。然而,某些場景可能需要創建一個單獨的上下文,共享相同的數據,但不受原始上下文取消的影響。

問題陳述

當前的任務是創建一個“克隆” Go 上下文ctx 的“(或副本),使得:

  • 它包含原始存儲中存儲的所有值ctx.
  • 當ctx被取消時,它不會被取消。 :

用法

您可以使用WithoutCancel函數在任何函數或方法中建立克隆上下文:

package main

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

func main() {
    ctx := context.Background()
    clone := WithoutCancel(ctx)

    // Create a goroutine using the clone context.
    go func() {
        // This goroutine will never be interrupted by cancelations on `ctx`.
        time.Sleep(time.Second)
    }()
}

結論

此解決方案提供了一種簡單的方法來創建永不取消的上下文,允許您執行比原始任務壽命較長的非同步任務情境。

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

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