2 回答

TA貢獻1790條經驗 獲得超9個贊
檢查他們的文檔:
func Background() ContextBackground 返回一個非零的空上下文。它永遠不會被取消,沒有價值,也沒有截止日期。它通常由 main 函數、初始化和測試使用,并作為傳入請求的頂級上下文。
func TODO() ContextTODO 返回一個非零的空上下文。當不清楚要使用哪個 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()也(可能)返回錯誤。

TA貢獻1789條經驗 獲得超8個贊
當不清楚要使用哪個 Context 或它尚不可用時(因為尚未擴展周圍函數以接受 Context 參數),代碼應使用 context.TODO。
Background 返回一個非零的空上下文。它永遠不會被取消,沒有價值,也沒有截止日期。它通常由 main 函數、初始化和測試使用,并作為傳入請求的頂級上下文。
TODO
是一個占位符,用于明確表示將來應使用更合適的上下文更新代碼,但目前還沒有。Background
當不需要這樣的指示并且您只需要一個沒有值或取消的空根上下文時使用。它們返回的值是相同的;唯一的區別是語義,因為人們可能會掃描代碼以TODO
查找上下文(或使用 linter 來這樣做)作為需要更新/尋址的地方。
- 2 回答
- 0 關注
- 408 瀏覽
添加回答
舉報