」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Go 的 context 套件如何用於超時 Goroutine?

Go 的 context 套件如何用於超時 Goroutine?

發佈於2025-01-12
瀏覽:224

How Can Go\'s `context` Package Be Used to Timeout Goroutines?

Go 如何處理超時 Goroutine?

問題:

您正在建立一個處理多個 HTTP 呼叫的工具在並發 goroutine 中。為了防止無限期執行的情況,您尋求一種在特定時間間隔後取消 goroutine 的方法。

解決方案:

同時創建goroutine 休眠的方法在指定的持續時間內發送廣播訊息來取消其他goroutine 似乎是合乎邏輯的,但此中goroutine的執行似乎存在問題scene.

為了應對這一挑戰,請考慮利用Go 中的上下文套件。它提供了一種有效的方法來處理 goroutine 的超時和上下文取消。

程式碼片段:

下面是使用 context 套件進行 goroutine 逾時管理的範例:

package main

import (
    "context"
    "fmt"
    "time"
)

func test(ctx context.Context) {
    t := time.Now()

    select {
    case <-time.After(1 * time.Second):
        fmt.Println("overslept")
    case <-ctx.Done():
        fmt.Println("cancelled")
    }
    fmt.Println("used:", time.Since(t))
}

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)

    go test(ctx)

    // cancel context after 30 milliseconds
    time.Sleep(30 * time.Millisecond)
    cancel()
}

此程式碼建立一個逾時時間為 50 毫秒的上下文。然後啟動一個 goroutine 來執行測試函數,並傳遞上下文。在測試函數中,選擇語句等待逾時發生或上下文被取消。 30 毫秒後,上下文被取消,導致 goroutine 完成並列印“cancelled”。

最新教學 更多>
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2025-01-12
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2025-01-12
  • HTML 格式標籤
    HTML 格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2025-01-12
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2025-01-12
  • 儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    儘管程式碼有效,為什麼 POST 請求無法擷取 PHP 中的輸入?
    解決PHP 中的POST 請求故障在提供的程式碼片段中:action=''而非:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"檢查$_POST陣列:表單提交後使用 var_dump 檢查 $_POST 陣列的內...
    程式設計 發佈於2025-01-12
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2025-01-12
  • 插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入資料時如何修復「常規錯誤:2006 MySQL 伺服器已消失」?
    插入記錄時如何解決「一般錯誤:2006 MySQL 伺服器已消失」介紹:將資料插入MySQL 資料庫有時會導致錯誤「一般錯誤:2006 MySQL 伺服器已消失」。當與伺服器的連線遺失時會出現此錯誤,通常是由於 MySQL 配置中的兩個變數之一所致。 解決方案:解決此錯誤的關鍵是調整wait_tim...
    程式設計 發佈於2025-01-12
  • 為什麼非常量變數不能用作 C++ 中的模板參數?
    為什麼非常量變數不能用作 C++ 中的模板參數?
    為什麼非常量變數不能作為範本參數傳遞? 在 C 中,範本參數必須是常數表達式。這意味著它們的值必須在編譯時已知。編譯器無法在此上下文中計算非常量變數。 考慮代碼:template <int a> void modify(){}要傳遞一個非常量變數作為範本參數,我們可以這樣寫:for(in...
    程式設計 發佈於2025-01-12
  • Go 的 context 套件如何用於超時 Goroutine?
    Go 的 context 套件如何用於超時 Goroutine?
    Go 如何處理超時 Goroutine? 問題:您正在建立一個處理多個 HTTP 呼叫的工具在並發 goroutine 中。為了防止無限期執行的情況,您尋求一種在特定時間間隔後取消 goroutine 的方法。 解決方案:同時創建goroutine 休眠的方法在指定的持續時間內發送廣播訊息來取消其他...
    程式設計 發佈於2025-01-12
  • 如何使用轉義序列在文字點上正確分割 Java 字串?
    如何使用轉義序列在文字點上正確分割 Java 字串?
    使用轉義序列在文字點上拆分Java 字串嘗試在文字點(“.”)上拆分Java字串時使用split() 方法時,必須使用轉義序列「\」對點進行轉義。此操作是必要的,因為 split() 方法將未轉義的點視為與任何字元相符的正規表示式,這可能會導致意外結果。 例如,請考慮以下程式碼:String fil...
    程式設計 發佈於2025-01-12
  • 每日 JavaScript 挑戰 #JS - 找出最長的公共前綴
    每日 JavaScript 挑戰 #JS - 找出最長的公共前綴
    每日 JavaScript 挑戰:找出最長的公共前綴 嘿,開發者們! ?歡迎來到今天的 JavaScript 程式設計挑戰。讓我們保持敏銳的程式設計技能! 挑戰 難度:中 主題:字串操作 描述 給定一個字串數組,編寫一個函數來尋找其中最長的公共前綴...
    程式設計 發佈於2025-01-11
  • 如何修復 macOS 上 Django 中的「配置不正確:載入 MySQLdb 模組時出錯」?
    如何修復 macOS 上 Django 中的「配置不正確:載入 MySQLdb 模組時出錯」?
    MySQL配置不正確:相對路徑的問題在Django中運行python manage.py runserver時,可能會遇到以下錯誤:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    程式設計 發佈於2025-01-11
  • 如何計算Oracle 11g中兩個日期之間的確切天數?
    如何計算Oracle 11g中兩個日期之間的確切天數?
    檢索Oracle 11g中日期之間的天數問題:如何我在Oracle 11g 中取得兩個日期之間的確切天數?使用表達式 sysdate - to_date('2009-10-01', 'yyyy-mm-dd') 會產生一個區間而不是整數。 答案:要在Oracle 11g...
    程式設計 發佈於2025-01-11
  • 使用單 Spa 建造微前端:指南
    使用單 Spa 建造微前端:指南
    TL;DR: 使用 single-spa 构建微前端可以更轻松地将大型应用程序拆分为小的独立部分,以便不同的团队可以在不影响其他团队的情况下处理各个部分。本博客展示了如何创建 Angular 和 React 微前端、将它们连接到根配置并进行部署。 微前端已成为扩展前端应用程序的流行架构风格,特别是当...
    程式設計 發佈於2025-01-11
  • 如何使用 MongoDB Go 驅動程式建立嵌套 OR/AND 查詢?
    如何使用 MongoDB Go 驅動程式建立嵌套 OR/AND 查詢?
    使用MongoDB Go Driver 進行嵌套邏輯查詢MongoDB 查詢通常需要使用嵌套邏輯運算子(AND/OR) 來過濾基於文檔的文檔根據多個標準。在 Go MongoDB 驅動程式中,可以使用 bson.D 和 bson.M 類型建構巢狀邏輯查詢。 建構嵌套OR/AND 查詢建立一個巢狀OR...
    程式設計 發佈於2025-01-11

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3