Dalam Go, memaksimumkan permintaan HTTP serentak melibatkan menangani had deskriptor fail. Ralat biasa yang terhasil daripada melebihi had ini ialah:
net/http: Request.Body is closed
Pendekatan Serentak yang Diperbaiki
Berikut ialah pelaksanaan serentak yang lebih berkesan menggunakan kumpulan pekerja dan saluran semaphore:
import ( "fmt" "log" "net/http" "runtime" "sync" "time" ) // Default values var ( reqs = 1000000 maxWorkers = 200 sem = make(chan bool, maxWorkers) respChan = make(chan *http.Response) respErrChan = make(chan error) ) func main() { runtime.GOMAXPROCS(runtime.NumCPU()) // Dispatcher: sends requests to the worker pool go func() { for i := 0; i < reqs; i++ { sem <- true req, err := http.NewRequest(http.MethodGet, "http://localhost:8080", nil) if err != nil { respErrChan <- err return } client := &http.Client{Timeout: 15 * time.Second} resp, err := client.Do(req) if err != nil { respErrChan <- err return } respChan <- resp } close(sem) close(respChan) }() // Worker Pool: sends requests to the API var wg sync.WaitGroup for i := 0; i < maxWorkers; i++ { wg.Add(1) go func() { defer wg.Done() for { select { case resp := <-respChan: fmt.Println(resp.Status) resp.Body.Close() sem <- true case err := <-respErrChan: log.Fatal(err) } } }() } wg.Wait() }
Pendekatan ini menggunakan kumpulan pekerja untuk menghantar permintaan serentak dalam tempoh terhad semaphore, mengekalkan bilangan permintaan serentak dalam had sistem. Pengendalian tindak balas juga dipertingkatkan, termasuk cetakan status dan penutupan badan. Teknik ini lebih tepat dan berskala berbanding dengan pelaksanaan asal.
Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Permintaan HTTP Serentak dengan Cekap dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!