首頁 > 後端開發 > Golang > 如何在沒有取消傳播的情況下使用 Go 中的上下文?

如何在沒有取消傳播的情況下使用 Go 中的上下文?

Mary-Kate Olsen
發布: 2024-11-08 20:57:02
原創
1043 人瀏覽過

How Can I Use Contexts in Go Without Cancellation Propagation?

沒有取消傳播的上下文:深入研究

Go 中的上下文提供了一種機制來傳遞任意值以及請求並追蹤取消。預設情況下,所有上下文共享相同的取消機制。但是,某些場景可能需要將上下文傳播與取消解耦。

對非取消情境的需求

考慮一個在請求生命週期之外執行任務的 HTTP 處理程序。回傳回應後,處理程序可以在 goroutine 中啟動非同步任務。此任務可能需要存取上下文值,但如果原始請求上下文被取消,則不得終止。

建立自訂非取消上下文

Go 1.21 中引入了WithoutCancel,提供了一種簡單的方法建立非取消上下文。使用此方法,我們可以獲得原始上下文的副本,其中包含其所有儲存值,但與其取消狀態無關。

實作非取消上下文

在 Go 1.21 之前,自訂非取消上下文的實作是必要的。關鍵是建立一個滿足context.Context 介面的類型並重寫以下方法以防止取消:

  • Deadline():始終傳回零時間並將第二個傳回值設為false,表示沒有截止日期。
  • Done():回傳一個 nil 頻道,表示不可能取消。
  • Err():總是回傳nil,表示沒有發生錯誤。

此外,實作必須儲存原始上下文並委託 Value() 呼叫來檢索儲存的值。

使用Non 的範例-取消上下文

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板