Lookup [HOST]: no such host Fehler in Gehen
Habe ich dieses test-Programm fetch url parallele, aber wenn ich steigen die parallele Zahl auf etwa 1040, ich fange an lookup www.httpbin.org: no such host
Fehler.
Nach etwas Google fand ich andere sagen, dass Sie nicht das Ende der Reaktion wird das problem verursachen, aber ich nicht schließen, dass mit res.Body.Close()
.
Was ist hier das problem? Dank sehr viel.
package main
import (
"fmt"
"net/http"
"io/ioutil"
)
func get(url string) ([]byte, error) {
client := &http.Client{}
req, _ := http.NewRequest("GET", url, nil)
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return nil, err
}
bytes, read_err := ioutil.ReadAll(res.Body)
res.Body.Close()
fmt.Println(bytes)
return bytes, read_err
}
func main() {
for i := 0; i < 1040; i++ {
go get(fmt.Sprintf("http://www.httpbin.org/get?a=%d", i))
}
}
- Ich von Ihnen positiv bewertet werden sowohl dystroy und simonmenke Antworten, weil Sie sind beide Recht. Sie nur näherte sich dem problem aus zwei verschiedenen Blickwinkeln. Das Problem ist, Sie schlagen die FD-Grenze durch die Eröffnung von über 1000 verbindungen zum host gleichzeitig. Dystroy die Antwort ist weniger FDs, indem Sie weniger gleichzeitige verbindungen und simonmenke s ist die Erhöhung der FD-Grenze. Für Ihren speziellen Fall empfehle ich Dystroy Antwort. Für jemand anderen läuft in das gleiche problem, kann es mehr Sinn machen, zu verwenden simonmenke ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Denn Sie können bis zu 1040 gleichzeitige Anrufe in Ihrem code, so dass Sie kann sehr gut sein in einem Staat mit 1040 Körper geöffnet und noch keine geschlossen.
Müssen Sie, um die Anzahl von goroutines verwendet.
Hier ist eine mögliche Lösung mit einem Grenzwert von 100 gleichzeitigen Anrufe, max :
Rufen Sie diese in der main-Funktion des Programms, kann es zu stoppen, bevor Sie alle Aufgaben fertig sind. Sie können eine
sync.WaitGroup
zu verhindern :sowie technisch in Ihrem Prozess ist begrenzt (vom Kernel) zu über 1000 offene Datei-Deskriptoren. Je nach Kontext könnten Sie brauchen, um diese Anzahl zu erhöhen.
In der shell ausführen (man beachte die Letzte Zeile):
Erhöhen (temporär):
Dann überprüfen Sie die fd-limit:
go
keyword-Funktionen gleichzeitig ausgeführt werden. Sie Holen alle 1040 urls auf einmal mit verschiedenen Anschlüssen. Weil dieses, Sie haben 1040 (größer als 1024) - FDs-auf einmal geöffnet.