2016-07-20 15 views
1

Ich muss mehrere URL gleichzeitig aufrufen. Meine Funktionen werden zur gleichen Zeit aufgerufen (in Millisekunden), aber sobald ich eine HTTP-Post-Anfrage an den Code anfüge, wird dieser nacheinander aufgerufen. Unten ist der Code:Golang: Simultane Funktion Anrufe für HTTP-Anfrage

Check(url1) 
Check(url2) 

func Check(xurl string) { 

    nowstartx := time.Now() 
    startnanos := nowstartx.UnixNano() 
    nowstart := startnanos/1000000 
    fmt.Println(nowstart) 

    json = {"name" : "test"} 
    req, err := http.NewRequest("POST", xurl, bytes.NewBuffer(json)) 
    req.Header.Set("X-Custom-Header", "myvalue") 
    req.Header.Set("Content-Type", "application/json") 
    client := &http.Client{} 
    resp, err := client.Do(req) 

    if err != nil { 
     panic(err) 

    } else { 
     defer resp.Body.Close() 
     body, _ = ioutil.ReadAll(resp.Body) 
    } 

} 

Hilfe zu schätzen, ich brauche die gleiche Zeit zu erhalten (in Millisekunden), wenn ich das Programm auszuführen.

+3

zur gleichen Zeit sind Sie nie, Sie waren jeweils seriell nennen erreicht, wurden sie sehr schnell gerade ausgeführt. Haben Sie eine Dokumentation zur Go-Parallelität gelesen? Zum Beispiel: https://tour.golang.org/concurrency/1 – JimB

+0

Ich ging durch diese https://www.goinggo.net/2014/01/concurrency-goroutines-and-gomaxprocs.html und es sollte gleichzeitig aufrufen. Ich habe es mehrere Male versucht und es tatsächlich gleichzeitig aufgerufen, außer wenn ich die Post-Anfrage hinzugefügt. Gibt es eine Möglichkeit, mehrere HTTP-Post-Anfragen gleichzeitig aufzurufen? – ChrisDave

+2

Nein, wo Sie eine neue Goroutine starten, also fügen Sie keine Nebenläufigkeit hinzu und diese 2 Aufrufe können nicht gleichzeitig ausgeführt werden. – JimB

Antwort

2

Dies wird durch Verwendung Goroutines

go Check(url1) 
go Check(url2) 

func Check(xurl string) { 

    nowstartx := time.Now() 
    startnanos := nowstartx.UnixNano() 
    nowstart := startnanos/1000000 
    fmt.Println(nowstart) 

    json = {"name" : "test"} 
    req, err := http.NewRequest("POST", xurl, bytes.NewBuffer(json)) 
    req.Header.Set("X-Custom-Header", "myvalue") 
    req.Header.Set("Content-Type", "application/json") 
    client := &http.Client{} 
    resp, err := client.Do(req) 

    if err != nil { 
     panic(err) 

    } else { 
     defer resp.Body.Close() 
     body, _ = ioutil.ReadAll(resp.Body) 
    } 

} 
+0

Wow, es hat wie ein Juwel funktioniert ... vielen Dank. – ChrisDave

+0

@ChrisDave Super, fühlen Sie sich frei, Antwort zu akzeptieren. – tier1