首頁 >後端開發 >Golang >將主協程上下文的副本傳遞給子程式上下文

將主協程上下文的副本傳遞給子程式上下文

WBOY
WBOY轉載
2024-02-09 23:30:09653瀏覽

將主協程上下文的副本傳遞給子程式上下文

在PHP中,協程是一種強大的程式設計工具,可以提高程式碼的執行效率。而在協程中,將主協程上下文的副本傳遞給子程式上下文是常用的操作。透過這種方式,可以在子程式中存取主協程的上下文數據,實現數據的共享和傳遞。這個過程在PHP中非常簡單,只需要使用yield關鍵字即可實現。在本文中,我們將由php小編小新為您詳細介紹如何將主協程上下文的副本傳遞給子例程上下文,並給出一些實例代碼,幫助您更好地理解和應用這一特性。

問題內容

我有一個 golang API 端點及其關聯的上下文。

端點需要在幕後執行一些繁重的工作,因此我在主端點內創建一個新的子例程,然後返回回應本身。

為了處理上下文取消,我建立了一個後台上下文並將其作為新上下文傳遞給子程式。

問題是透過這樣做,是的,我可以執行後台子例程,但是主上下文中的值,例如請求ID,跨度ID等(大多數鍵我都不知道),這些值被用於追踪將會遺失。

即使在回應傳送到客戶端後,如何將父上下文傳遞給子程式而不取消執行。

編輯

我沒有將任何值傳遞到上下文中。 但最初我們傳遞的是追蹤所需的 request-id、span-id 等。 這些資訊都在上下文中。 這是一個內部庫,上下文是我們保存它的地方。

我知道這是使用上下文傳遞值的反模式,除了請求ID 和其他對庫而不是業務邏輯重要的值之外,不會傳遞任何值

解決方法

#當您取消父上下文時,從其派生的所有上下文也會取消。因此,您為請求處理程序產生的 goroutine 建立新上下文是正確的。

當您建立新上下文時,您應該將您感興趣的所有值從原始上下文複製到新上下文。然而,你說你不知道所有的鑰匙。因此,您仍然可以保留對父上下文的引用,以便可以查詢它的值。像這樣的事情:

type nestedContext struct {
   context.Context
   parent context.Context
}

func (n nestedContext)  Value(key any) any {
   return n.parent.Value(key)
}

...
newContext := nestedContext{
   Context:context.Background(),
   parent: parentContext,
}

這將從 context.background() 建立一個新上下文,該上下文將從取消的父上下文中尋找值。

newcontext 作為上下文傳遞給從處理程序建立的 goroutine。

以上是將主協程上下文的副本傳遞給子程式上下文的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除