首頁 後端開發 Golang context在Golang函數並發程式設計中的作用

context在Golang函數並發程式設計中的作用

Apr 17, 2024 pm 02:27 PM
golang 並發程式設計 context 鍵值對

context套件在Golang函數並發程式設計中用於管理協程執行,它提供了以下作用:傳播取消訊號,允許協程在任務完成前中斷其他協程。設定截止時間,如果協程在截止時間內未完成則自動取消。傳遞附加訊息,允許協程之間傳遞鍵值對。

context在Golang函數並發程式設計中的作用

context在Golang函數並發程式設計中的作用

context套件是Golang中用於管理函數並發執行的關鍵工具。它提供了在協程之間傳遞請求取消訊號、截止時間和其他相關資訊的能力。

作用

  • 取消訊號傳播:context允許協程傳遞取消訊號,從而允許發起者協程在任務完成之前中斷正在執行的協程。
  • 截止時間設定:context可以指定截止時間,如果協程在截止時間之前未完成,則自動取消。
  • 值傳遞:context可以攜帶任何類型的鍵值對,允許協程之間傳遞附加資訊。

使用

要建立context對象,可以使用context.Background() context.WithCancel()

// 创建一个新context,取消信号为默认
ctx := context.Background()

// 创建一个带有取消信号的新context
ctx, cancel := context.WithCancel()
登入後複製

取消協程

要取消協程,只需呼叫cancel()函數。這將發送取消訊號到所有監聽該context的協程。

// 取消协程
cancel()
登入後複製

監聽取消訊號

協程可以使用context.Done()通道監聽取消訊號。當通道關閉時,表示context已取消。

// 监听取消信号
select {
case <-ctx.Done():
    // 处理取消
}
登入後複製

實戰案例

#考慮以下對HTTP請求進行逾時的協程:

func MakeRequest(ctx context.Context, url string) (*http.Response, error) {
    // 创建一个带有截止时间的context
    ctx, cancel := context.WithTimeout(ctx, 10*time.Second)
    defer cancel()

    // 发起HTTP请求
    req, err := http.NewRequest(http.MethodGet, url, nil)
    if err != nil {
        return nil, err
    }

    req = req.WithContext(ctx)
    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        return nil, err
    }

    return resp, nil
}
登入後複製

在此範例中:

  • 使用context.WithTimeout()建立帶有10秒截止時間的context
  • 請求被設定為此context,允許底層網路呼叫逾時並取消請求。
  • defer cancel()確保在函數退出時取消context,防止任何其他協程被阻塞。

透過使用context,我們可以控制協程的執行,避免資源洩漏和不必要的等待。

以上是context在Golang函數並發程式設計中的作用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用 Golang 安全地讀取和寫入檔案? 如何使用 Golang 安全地讀取和寫入檔案? Jun 06, 2024 pm 05:14 PM

如何使用 Golang 安全地讀取和寫入檔案?

如何為 Golang 資料庫連線配置連線池? 如何為 Golang 資料庫連線配置連線池? Jun 06, 2024 am 11:21 AM

如何為 Golang 資料庫連線配置連線池?

Golang 與 C++ 的異同 Golang 與 C++ 的異同 Jun 05, 2024 pm 06:12 PM

Golang 與 C++ 的異同

golang框架架構的學習曲線有多陡峭? golang框架架構的學習曲線有多陡峭? Jun 05, 2024 pm 06:59 PM

golang框架架構的學習曲線有多陡峭?

如何在 Golang 中從列表中產生隨機元素? 如何在 Golang 中從列表中產生隨機元素? Jun 05, 2024 pm 04:28 PM

如何在 Golang 中從列表中產生隨機元素?

golang框架的優缺點比較 golang框架的優缺點比較 Jun 05, 2024 pm 09:32 PM

golang框架的優缺點比較

Golang 框架中的錯誤處理最佳實務有哪些? Golang 框架中的錯誤處理最佳實務有哪些? Jun 05, 2024 pm 10:39 PM

Golang 框架中的錯誤處理最佳實務有哪些?

golang框架文件使用說明 golang框架文件使用說明 Jun 05, 2024 pm 06:04 PM

golang框架文件使用說明

See all articles