亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

沒有取消傳播的上下文

沒有取消傳播的上下文

Go
翻閱古今 2023-06-01 14:24:13
我如何創建一個 Go 上下文的副本(如果你愿意的話,一個克?。?,它包含存儲在原始文件中的所有值,但不會在原始文件被取消時被取消?對我來說,這確實是一個有效的用例。假設我有一個 http 請求,它的上下文在響應返回給客戶端后被取消,我需要在這個請求結束時在一個單獨的 goroutine 中運行一個異步任務,這個 goroutine 很可能比父上下文活得更久。func Handler(ctx context.Context) (interface{}, error) {        result := doStuff(ctx)        newContext := howDoICloneYou(ctx)        go func() {                doSomethingElse(newContext)        }()        return result}誰能建議應該如何完成?當然,我可以跟蹤所有可能放入上下文中的值,創建一個新的背景 ctx,然后遍歷每個可能的值并復制……但這看起來很乏味,而且很難在大型代碼庫中進行管理。
查看完整描述

3 回答

?
慕蓋茨4494581

TA貢獻1850條經驗 獲得超11個贊

由于 context.Context 是一個接口,您可以簡單地創建自己的永遠不會取消的實現:


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}

}


查看完整回答
反對 回復 2023-06-01
?
MYYA

TA貢獻1868條經驗 獲得超4個贊

誰能建議應該如何完成?

是的。不要這樣做。

如果您需要不同的上下文,例如對于您的異步后臺任務,則創建一個新的上下文。您的傳入上下文和您的后臺任務之一無關,因此您不能嘗試重用傳入的上下文。

如果不相關的新上下文需要來自原始上下文的一些數據:復制您需要的內容并添加新內容。


查看完整回答
反對 回復 2023-06-01
?
月關寶盒

TA貢獻1772條經驗 獲得超5個贊

從 go 1.21 開始,此功能將通過以下方式直接在標準庫中提供context.WithoutCancel

func?WithoutCancel(parent?Context)?Context

WithoutCancel返回 parent 的副本,當 parent 被取消時,該副本未被取消。返回的上下文不返回Deadlineor?Err,其Done通道為nil。調用Cause返回的上下文返回nil。


查看完整回答
反對 回復 2023-06-01
  • 3 回答
  • 0 關注
  • 154 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號