在負載測試中,大量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) }
說明:
這種方法確保goroutine被取消當超過指定時間時取消,無論它們在程式碼中的位置如何。
以上是如何使用上下文在設定時間後優雅地停止 Goroutine?的詳細內容。更多資訊請關注PHP中文網其他相關文章!