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

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

context.TODO() 或 context.Background(),我更喜歡哪一個?

context.TODO() 或 context.Background(),我更喜歡哪一個?

Go
HUX布斯 2023-03-07 14:43:16
我目前正在將我們的代碼從全局標志包遷移到 mongo-driver,不知道我應該在哪里使用context.TODO(),context.Background()這真的很混亂,我知道它返回非零空,所以我應該context.Background()在主函數中使用 &init()功能?context.TODO()并在其他地方使用?有人能幫忙嗎?試圖檢查我應該使用哪個參數context.TODO()或context.Background().
查看完整描述

2 回答

?
富國滬深

TA貢獻1790條經驗 獲得超9個贊

檢查他們的文檔:

context.Background():

func Background() Context

Background 返回一個非零的空上下文。它永遠不會被取消,沒有價值,也沒有截止日期。它通常由 main 函數、初始化和測試使用,并作為傳入請求的頂級上下文。

context.TODO():

func TODO() Context

TODO 返回一個非零的空上下文。當不清楚要使用哪個 Context 或它尚不可用時(因為尚未擴展周圍函數以接受 Context 參數),代碼應使用 context.TODO。

根據文檔,當您需要一個上下文但您(還)沒有并且不知道該使用什么時,請使用context.TODO(). 這正是你的情況,使用context.TODO()正確的文件記錄。此外,靜態分析工具和 IDE 可能會支持發現這些上下文,并在稍后向您發出警告以解決該問題。

另請注意,如果在必須使用 mongo 驅動程序時確實有上下文,請考慮使用該上下文,或從中派生一個新上下文。

例如,如果您正在編寫一個需要查詢某些文檔的 HTTP 處理程序,則 HTTP 請求http.Request已經有一個上下文,您可以使用Request.Context(). 當您調用需要上下文的其他 API 函數時,這是一個主要的候選對象。

為什么,你可能會問?因為當 HTTP 客戶端放棄/中止請求時請求的上下文被取消,這意味著無論你做什么,客戶端都不會收到它,所以例如如果 HTTP 處理程序只是提供信息,你也可以中止生成它,節省一些資源。因此,如果在您執行 MongoDB 查詢時請求上下文被取消,您也可以取消查詢,因為您無論如何都不需要(不會處理)結果。取消傳遞給查詢執行的上下文(Collection.Find()例如)是告訴 MongoDB 服務器在可能的情況下取消查詢的方法(因為您不需要結果)。

因此,在這種情況下使用請求上下文可以在 HTTP 服務器和 MongoDB 服務器上為您節省一些 CPU 時間和內存。

另一個例子:假設您必須在 10 秒內生成 HTTP 響應(可能是平臺限制),在此期間您必須執行 MongoDB 操作,并且必須對結果進行后處理,這需要 4 秒。在這種情況下,如果 MongoDB 操作花費的時間超過 6 秒,您將無法完成后處理以適應 10 秒的限制。因此,如果 MongoDB 操作沒有在 6 秒內完成,您還不如取消它。

解決這個問題的一個簡單方法是派生一個超時為 6 秒的上下文:


如果查詢在 30 秒內完成,一切都很好,您可以使用結果。如果不是,上下文將在 30 秒后被取消,因此c.Find()也(可能)返回錯誤。


查看完整回答
反對 回復 2023-03-07
?
拉丁的傳說

TA貢獻1789條經驗 獲得超8個贊

context.TODO:

當不清楚要使用哪個 Context 或它尚不可用時(因為尚未擴展周圍函數以接受 Context 參數),代碼應使用 context.TODO。

context.Background:

Background 返回一個非零的空上下文。它永遠不會被取消,沒有價值,也沒有截止日期。它通常由 main 函數、初始化和測試使用,并作為傳入請求的頂級上下文。

TODO是一個占位符,用于明確表示將來應使用更合適的上下文更新代碼,但目前還沒有。Background當不需要這樣的指示并且您只需要一個沒有值或取消的空根上下文時使用。它們返回的值是相同的;唯一的區別是語義,因為人們可能會掃描代碼以TODO查找上下文(或使用 linter 來這樣做)作為需要更新/尋址的地方。


查看完整回答
反對 回復 2023-03-07
  • 2 回答
  • 0 關注
  • 408 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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