首頁 >後端開發 >Golang >如何使用上下文在設定時間後優雅地停止 Goroutine?

如何使用上下文在設定時間後優雅地停止 Goroutine?

Barbara Streisand
Barbara Streisand原創
2024-11-20 14:48:18833瀏覽

How to Gracefully Stop Goroutines After a Set Time Using Context?

如何使用上下文在指定時間後停止Goroutine

問題背景

在負載測試中,大量HTTP 呼叫在Goroutine 中編排,它變成對於控制這些例程的執行持續時間至關重要。這允許用戶在預先定義的時間終止負載測試。

失敗的方法

實現此目的的常見嘗試是使用 goroutine 來監視 time.Sleep() 持續時間和廣播終止訊號通過管道。雖然這種方法在某些情況下可能就足夠了,但當 goroutine 繼續在主 goroutine 之外進行 HTTP 呼叫時,它會失敗。

解決方案:使用上下文

Go 1.7 引入了基本的 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("used:", time.Since(t))
}

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

說明:

  1. 在測試函數內,一個上下文建立 50 毫秒超時。
  2. select 語句檢查time.After 通道是否有事件(表示睡眠
  3. 當上下文超時時,select語句退出,表明goroutine已被取消。

這種方法確保goroutine被取消當超過指定時間時取消,無論它們在程式碼中的位置如何。

以上是如何使用上下文在設定時間後優雅地停止 Goroutine?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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