使用 Goroutine 時,必須考慮超時和 Goroutine 管理。以下程式碼片段示範了一個包含多個 HTTP 呼叫的組合逾時的函數:
<code class="go">func Find() (interface{}, bool) { ch := make(chan Response, 1) go func() { data, status := findCicCode() ch <- Response{data: data, status: status} }() select { case response := <-ch: return response.data, response.status case <-time.After(50 * time.Millisecond): return "Request timed out", false } }</code>
雖然此方法提供了一種處理超時的方法,但有人擔心,即使在逾時已過。為了解決這個問題,請考慮使用上下文,它提供了對取消的精細控制:
<code class="go">// create a timeout or cancelation context to suit your requirements ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() req, err := http.NewRequest("GET", location, nil) // add the context to each request and they will be canceled in unison resp, err := http.Do(req.WithContext(ctx))</code>
透過合併上下文,您可以統一取消 HTTP 請求,確保它們不會在後台運行。這種技術有助於避免 goroutine 洩漏並保持程式碼完整性。
以上是Go中如何有效防止Goroutine洩漏並管理逾時?的詳細內容。更多資訊請關注PHP中文網其他相關文章!