2016-11-18 38 views
0

我正在与我的城市的公交车频率的API工作,但当我尝试使HTTP获取到许多网址时,我有点卡在线程上。 如果没有并发性,程序需要16分钟才能完成1500个URL调用来获取HTTP状态代码,并且我试图使用并发性,但在阅读了很多帖子之后,我不明白goroutines是如何工作的...多线程去HTTP获取

的想法是让一个功能和变更请求的数量,喜欢这里:

go getBusPostStatus(600, 800) 

但我是在完全stucked ...

下面是代码:

package main 

import (
"fmt" 
"net/http" 
"strconv" 
"time" 
) 
var i int = 0 
var convStr string 
var message = make(chan string) 

/*func main(){ 
    for i = 0; i < 1500; i++ { 
     z = strconv.Itoa(i) 
     url := "http://www.urbanosdezaragoza.es/frm_esquemaparadatime.php?poste=" + z 
     resp, err := http.Get(url) 
     if err != nil { 
      fmt.Println("Houston, we've got problems") 
     }else{ 
      if resp.StatusCode == 200{ 
       fmt.Println("OK: El poste "+z+" existe") 
      }else{ 
       fmt.Println("WARN: El poste "+z+" NO existe") 
      } 
     } 
    } 
}*/ 

//Return 2 houndred posts 
func returnTH(c chan string){ 
for i = 0; i < 200; i++ { 
    convStr = strconv.Itoa(i) 
    url := "http://www.urbanosdezaragoza.es/frm_esquemaparadatime.php?poste=" + convStr 
    resp, err := http.Get(url) 
    if err != nil { 
     fmt.Println("Houston, we've got problems") 
    }else{ 
     if resp.StatusCode == 200{ 
      //fmt.Println("OK: El poste "+z+" existe") 
      c <- "OK: The bus post "+convStr+" exists" 
     }else{ 
      //fmt.Println("WARN: El poste "+z+" NO existe") 
      c <- "WARN: The bus post "+convStr+" does not exist" 
     } 
    } 
    } 
} 
func returnFH(z chan string){ 
    for i = 201; i < 400; i++ { 
    convStr = strconv.Itoa(i) 
    url := "http://www.urbanosdezaragoza.es/frm_esquemaparadatime.php?poste=" + convStr 
    resp, err := http.Get(url) 
    if err != nil { 
     fmt.Println("Houston, we've got problems") 
    }else{ 
     if resp.StatusCode == 200{ 
      //fmt.Println("OK: El poste "+z+" existe") 
      z <- "OK: The bus post "+convStr+" exists" 
     }else{ 
      //fmt.Println("WARN: El poste "+z+" NO existe") 
      z <- "WARN: The bus post "+convStr+" does not exist" 
     } 
    } 
    } 
} 

func threadPrint(c, z chan string){ 
    for { 
     threadOne := <- c 
     threadTwo := <- z 
     fmt.Println(threadOne) 
     fmt.Println(threadTwo) 
    } 
} 
func main(){ 
    start := time.Now() 
    var c chan string = make(chan string) 
    var z chan string = make(chan string) 
    //for i = 0; i < 1500; i++{ 
    go returnTH(c) 
    go returnFH(z) 
    go threadPrint(c,z) 
    /*go getBusPostStatus(400, 600) 
    go getBusPostStatus(600, 800) 
    go getBusPostStatus(800, 1000) 
    go getBusPostStatus(1000, 1200) 
    go getBusPostStatus(1200, 1400) 
    go getBusPostStatus(1400, 1500)*/ 
    //} 
    timeExec:= time.Since(start) 
    fmt.Println("Time to exec code = ", timeExec) 

    /*var input string 
    fmt.Scanln(&input) 
    fmt.Println("done")*/ 
} 

非常感谢提前!

+0

什么是'getBusPostStatus'?你坚持什么? – JimB

+0

这是一个“想法”,每200次调用一次线程就可以创建一个线程,但我不知道如何在线程中创建线程,这是没有线程的“旧系统”。我被困在使用线程创建1500个URL的方式上,因为第一个被评论的函数,即old/* main * /,需要16分钟才能完成1500个响应......非常感谢您的帮助! – Brokes

+2

Go没有线程,但是如果你的意思是goroutines,那么你已经通过用'go'关键字调度函数来使用它们了。 – JimB

回答

0

以下是一个简单的示例代码,它使用goroutine和channel来同时请求100次并打印结果。希望这段代码有帮助。

package main 

import (
    "fmt" 
    "math/rand" 
    "time" 
) 

func main() { 
    rep := 100 
    results := make(chan string) 

    // Use goroutine to send multiple time-consuming jobs to the channel. 
    for i := 0; i < rep; i++ { 
     go func(num int) { 
      results <- mockHTTPRequest(num) 
     }(i) 
    } 

    // Receive results from the channel and use them. 
    for i := 0; i < rep; i++ { 
     fmt.Println(<-results) 
    } 
} 

func mockHTTPRequest(num int) string { 
    timeDelay := rand.Intn(5000) 
    time.Sleep(time.Duration(timeDelay) * time.Millisecond) 
    if timeDelay%2 == 0 { 
     return fmt.Sprintf("OK: The bus post %v exists", num) 
    } 
    return fmt.Sprintf("WARN: The bus post %v does not exist", num) 
} 

您可以在https://play.golang.org/p/RR34roRIl4上运行此代码。

+0

感谢您的帮助!那么,这个想法是:你打电话给一个网址,例如:http://www.urbanosdezaragoza.es/frm_esquemaparadatime.php?poste=2,最后一个数字,在这种情况下,“2”是数字在这种情况下,HTTP将返回一个HTTP - > 200,因为这个帖子存在...问题是一个接一个,紧密地从1500到1500的1500个电话...我不知道HOW让Goorine一次打出3或4个电话,使用Go的“线程”,从0到1500 ...非常感谢您的帮助,bcoz我从昨天开始就完全陷入了僵局...... – Brokes