首頁 > 後端開發 > Golang > 主體

在延遲函數中重複使用 context.WithTimeout

WBOY
發布: 2024-02-09 16:21:21
轉載
1132 人瀏覽過

在延迟函数中重用 context.WithTimeout

在延遲函數中重複使用context.WithTimeout是一種有效的方法,它能夠在處理逾時操作時提供更好的控制和靈活性。透過使用php小編柚子提供的context.WithTimeout函數,可以在函數執行期間設定逾時時間,一旦超過設定的時間,函數將自動退出並傳回錯誤訊息。這種方式可以避免函數長時間阻塞,提高程式的穩定性和反應性。同時,透過在延遲函數中重複使用context.WithTimeout,也可以實現對不同函數的逾時控制,讓程式碼更加簡潔、易於維護。

問題內容

來自mongodb 的go 快速入門部落格文章的以下程式碼片段(為簡潔而減少)在連接資料庫時建立context.withtimeout ,並將其重用於延遲的disconnect 函數,我認為這是有問題的。

func main() {
    client, _ := mongo.newclient(options.client().applyuri("<atlas_uri_here>"))
    ctx, _ := context.withtimeout(context.background(), 10*time.second)

    _ = client.connect(ctx)
    defer client.disconnect(ctx)
}
登入後複製

我的思路-

context.withtimeout 在建立時以 unix 時間設定截止時間。 因此,將其傳遞給 connect 是有意義的,因為我們希望在超過時間限制(即派生的 unix 時間)時取消建立連接的過程。

現在,將相同的 ctx 傳遞給延遲的 disconnect(很可能在將來稍後調用)將導致 ctx 的時間成為過去。意思是,當函數開始執行時它就已經過期了。這不是預期的結果,並且破壞了引用 disconnect 文件的邏輯-

If the context expires via cancellation,
deadline, or timeout before the in use connections have returned, the in use
connections will be closed, resulting in the failure of any in flight read
or write operations.
登入後複製

請告訴我是否以及如何錯誤和/或遺漏了某些內容。

解決方法

你的理解是正確的。

在範例中就足夠了,因為範例只是連接到資料庫,執行一些範例操作(例如列出資料庫),然後main() 結束,因此使用相同的上下文運行延遲斷開連接不會造成任何麻煩(範例將/應該在10 秒內運作良好)。

在「現實世界」的應用程式中,情況當然不會如此。因此,您可能不會使用相同的上下文進行連接和斷開連接(除非該上下文沒有逾時)。

以上是在延遲函數中重複使用 context.WithTimeout的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板