首頁  >  文章  >  後端開發  >  如何在 Go 中優雅地超時 Goroutine?

如何在 Go 中優雅地超時 Goroutine?

Patricia Arquette
Patricia Arquette原創
2024-11-19 11:56:02967瀏覽

How to Gracefully Timeout Goroutines in Go?

如何在 Go 中讓 Goroutines 超時來控制執行時間

Goroutines 是 Go 並發的一個組成部分,允許非同步執行任務。但是,有時,有必要控制這些例程的持續時間並防止它們無限期地執行。

背景與問題

在負載測試工具中,您想要在指定時間後終止 goroutine 以限制 HTTP 呼叫過程的持續時間。目前在 goroutine 中使用 time.Sleep() 的方法建立了一個通訊通道,但會導致 goroutine 過早終止。

使用Context 的解決方案

更多建議的方法涉及利用golang.org/x/net/context 套件(Go 1.7 的標準庫中提供),特別是context.Context 介面。 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)
}

在此程式碼中:

  • 上下文。使用 context.WithTimeout() 建立超時為 50 毫秒的上下文。
  • test() goroutine 在此上下文中運行,並透過 select 等待指令。
  • 逾時後,select 接收ctx.Done() 訊號並優雅地退出 goroutine,防止睡過頭。

以上是如何在 Go 中優雅地超時 Goroutine?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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