Я следующий код, где я пытаюсь вызвать АНИ 10000 раз, но я получаю ошибки:Как запустить 10000 goroutines параллельно, где каждая процедура вызывает api?
package main
import (
"fmt"
"net/http"
"runtime"
"sync"
"time"
)
func main() {
nCPU := runtime.NumCPU()
runtime.GOMAXPROCS(nCPU)
var wg sync.WaitGroup
totalRequests := 100000
wg.Add(totalRequests)
fmt.Println("Starting Go Routines")
start := time.Now()
total := 0
for i := 0; i < totalRequests; i++ {
go func(current int) {
defer wg.Done()
startFunc := time.Now()
_, err := http.Get("http://127.0.0.1:8080/event/list")
// resp, err := http.Get("https://graph.facebook.com/v2.4/me" + "?fields=id%2Cname&access_token=" + "CAACEdEose0cBAEpQvcsvVMQu5oZCyyDjcEPQi9yCdiXimm4F0AYexGHPZAJHgpyrFOJN5X1VMcicNJjlkaCquUqHMZAfRrtxx6K9cRIROrA0OmbqAqCcg8ZA3qJZCHCl68I1n4LtFb5qxPcotlP5ne5PBakK0OUa7sc6FAOWwByOnFtNZBpIe8XDeM4YFa33sDfftVUpZCoBgZDZD")
if err != nil {
fmt.Println(err)
}
// defer resp.Body.Close()
elapsedFunc := time.Since(startFunc)
fmt.Println("The request (", current, ") took", elapsedFunc, "No of requests completed", total)
total++
}(i)
}
wg.Wait()
elapsed := time.Since(start)
fmt.Println("\nThe total time with cores", elapsed)
fmt.Println("\nTerminating Program")
}
Ошибки я получаю:
Get http://127.0.0.1:8080/event/list: dial tcp 127.0.0.1:8080: socket: too many open files
The request (5390) took 1.619876633s No of requests completed 2781
Get http://127.0.0.1:8080/event/list: dial tcp 127.0.0.1:8080: socket: too many open files
The request (7348) took 650.609825ms No of requests completed 1445
вы пытаетесь открыть слишком много сокетов. Либо ограничивайте одновременные запросы, либо увеличивайте пределы процесса. – JimB
вы также увеличиваете общее количество небезопасным способом, это легко не будет увеличивать количество прогонов. Используйте atomic.AddInt64 (& total) (и измените на total: = int64 (0)) –
@evanmcdonnal: эта ошибка вызвана исчерпанием файловых дескрипторов. Не имеет никакого отношения к удаленному хосту. – JimB