Go語(yǔ)言通過(guò)Goroutine和標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)高效并發(fā)HTTP處理。1. 使用sync.WaitGroup可并發(fā)發(fā)起多個(gè)HTTP請(qǐng)求,提升效率;2. 通過(guò)帶緩沖channel作為信號(hào)量限制并發(fā)數(shù),防止資源耗盡;3. http.Server默認(rèn)為每個(gè)請(qǐng)求分配Goroutine,天然支持并發(fā);4. 建議重用http.Client、設(shè)置超時(shí)、使用context控制生命周期,并配置連接池優(yōu)化性能。
Go語(yǔ)言通過(guò)輕量級(jí)的Goroutine和強(qiáng)大的標(biāo)準(zhǔn)庫(kù),讓處理并發(fā)HTTP請(qǐng)求變得簡(jiǎn)單高效。你不需要引入額外框架,就能輕松實(shí)現(xiàn)高并發(fā)的HTTP服務(wù)或客戶端請(qǐng)求處理。
在Go中,每個(gè)HTTP請(qǐng)求可以放在一個(gè)獨(dú)立的Goroutine中執(zhí)行,這樣多個(gè)請(qǐng)求能同時(shí)進(jìn)行,而不是串行等待。
以下是一個(gè)并發(fā)發(fā)起多個(gè)HTTP GET請(qǐng)求的示例:
package main <p>import ( "fmt" "io/ioutil" "net/http" "sync" )</p><p>func fetch(url string, wg *sync.WaitGroup) { defer wg.Done() resp, err := http.Get(url) if err != nil { fmt.Printf("Error fetching %s: %v\n", url, err) return } defer resp.Body.Close()</p><pre class='brush:php;toolbar:false;'>body, _ := ioutil.ReadAll(resp.Body) fmt.Printf("Fetched %d bytes from %s\n", len(body), url)
}
立即學(xué)習(xí)“go語(yǔ)言免費(fèi)學(xué)習(xí)筆記(深入)”;
func main() { urls := []string{ "http://ipnx.cn/link/5f69e19efaba426d62faeab93c308f5c", "http://ipnx.cn/link/ef246753a70fce661e16668898810624", "http://ipnx.cn/link/4d2fe2e8601f7a8018594d98f28706f2", }
var wg sync.WaitGroup for _, url := range urls { wg.Add(1) go fetch(url, &wg) } wg.Wait()
}
立即學(xué)習(xí)“go語(yǔ)言免費(fèi)學(xué)習(xí)筆記(深入)”;
說(shuō)明:使用 sync.WaitGroup 等待所有Goroutine完成。每個(gè)請(qǐng)求在獨(dú)立的Goroutine中執(zhí)行,實(shí)現(xiàn)并發(fā)。
無(wú)限制地啟動(dòng)Goroutine可能導(dǎo)致系統(tǒng)資源耗盡或被目標(biāo)服務(wù)器限流??梢酝ㄟ^(guò)帶緩沖的channel控制最大并發(fā)數(shù)。
func limitedFetch(urls []string) { const maxConcurrent = 3 sem := make(chan struct{}, maxConcurrent) var wg sync.WaitGroup <pre class='brush:php;toolbar:false;'>for _, url := range urls { wg.Add(1) go func(u string) { defer wg.Done() sem <- struct{}{} // 獲取信號(hào)量 defer func() { <-sem }() // 釋放信號(hào)量 resp, err := http.Get(u) if err != nil { fmt.Printf("Error: %v\n", err) return } defer resp.Body.Close() fmt.Printf("Success: %s\n", u) }(url) } wg.Wait()
}
立即學(xué)習(xí)“go語(yǔ)言免費(fèi)學(xué)習(xí)筆記(深入)”;
說(shuō)明:使用容量為3的channel作為信號(hào)量,確保最多只有3個(gè)請(qǐng)求同時(shí)運(yùn)行。
Go的 http.Server 默認(rèn)為每個(gè)請(qǐng)求分配一個(gè)Goroutine,天然支持并發(fā)處理。
你只需注冊(cè)處理函數(shù),Go會(huì)自動(dòng)并發(fā)執(zhí)行:
func handler(w http.ResponseWriter, r *http.Request) { // 模擬耗時(shí)操作 time.Sleep(1 * time.Second) fmt.Fprintf(w, "Hello from %s", r.URL.Path) } <p>func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) }</p>
多個(gè)客戶端同時(shí)訪問(wèn)時(shí),每個(gè)請(qǐng)求由獨(dú)立的Goroutine處理,互不阻塞。
基本上就這些。Go的并發(fā)模型簡(jiǎn)潔有力,配合HTTP包能快速構(gòu)建高性能網(wǎng)絡(luò)程序。關(guān)鍵在于合理控制并發(fā)度,避免過(guò)度消耗資源。
以上就是Golang如何處理并發(fā)HTTP請(qǐng)求的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)