2 回答

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個(gè)贊
根據(jù)我的經(jīng)驗(yàn),Context
有兩個(gè)主要用例:
傳遞信息。對(duì)于您的問題,您可能希望
request_id
為每個(gè)請(qǐng)求生成一個(gè)并將其傳遞到代碼的最低部分,并記錄它request_id
以在整個(gè)代碼庫中進(jìn)行錯(cuò)誤跟蹤。此功能并不總是有用,例如您想要初始化 MongoDB 連接,但它是在服務(wù)啟動(dòng)期間完成的。此時(shí)沒有有意義的上下文,
context.Background
超時(shí)應(yīng)該足夠了。對(duì)從 中檢索到的變異值要小心,
Context
如果您要傳遞Context
所有內(nèi)容,這可能會(huì)導(dǎo)致并發(fā)訪問。自動(dòng)取消和超時(shí)。這兩個(gè)功能并非無中生有,您需要調(diào)整代碼以處理來自
Context
. 但是大多數(shù)帶有參數(shù)的第三方庫和標(biāo)準(zhǔn)庫Context
都可以很好地處理這兩個(gè)特性(例如數(shù)據(jù)庫庫、HTTP 調(diào)用庫)。Context
使用此功能,您可以在失效 后自動(dòng)回收資源。有時(shí)您會(huì)想要停止這種級(jí)聯(lián)行為,例如在后臺(tái) goroutine 中寫入日志,那么您需要?jiǎng)?chuàng)建一個(gè)新的 goroutine
context.Background()
以避免這些寫入在上游上下文被取消后被取消。context.Background()
還會(huì)清除信息上下文,因此有時(shí)您需要從上游上下文中提取上下文信息,并手動(dòng)將它們附加到這個(gè)新上下文中。
Context
將參數(shù)強(qiáng)制用于所有函數(shù)有點(diǎn)矯枉過正,(添加Context
到簡(jiǎn)單greatestCommonDivisor
函數(shù)沒有意義)但是將Context
參數(shù)添加到您需要的任何地方永遠(yuǎn)不會(huì)造成傷害。Context
具有足夠好的性能,對(duì)于您的用例(HTTP 服務(wù)器和數(shù)據(jù)庫編寫),它不應(yīng)該對(duì)您的服務(wù)造成可見的開銷。

TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊
我對(duì)自己的問題找到了一個(gè)有趣的答案,所以如果有同樣的問題,我更愿意把它放在這里供未來的用戶使用。
如果我將連接到 Mongo 的 SAME 上下文傳遞給 touserController
并將其進(jìn)一步向下傳遞以CreateUser
運(yùn)行:
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
注意:不是在函數(shù)中取消上下文,而是在NewMongoStore
函數(shù)defer cancel()
中取消上下文main
。
10 秒后,如果你打電話POST /users
,你會(huì)得到context deadline exceeded
,所以基本上你不能使用這個(gè)上下文來做其他事情,你必須在每次CreateUser
調(diào)用時(shí)創(chuàng)建新的上下文。
所以我寫的很好。在我的示例中,我等待 10 秒連接到mongo
,插入操作上下文等待 1 秒。
- 2 回答
- 0 關(guān)注
- 123 瀏覽
添加回答
舉報(bào)