在GO中以异步方式获取URL列表

时间:2014-02-20 19:10:10

标签: go

我的GO应用程序,我经常需要查询列表或网址。由于GO从头开始是异步的,因此它是使用此功能的理想场所。

解决这个问题的最佳方法是什么?我找到了一个blog提出了一个解决方案,但它失败了,并列出了一个空的网址列表。

谢谢!

2 个答案:

答案 0 :(得分:1)

我已经在您提供的博客链接中调整了代码,并使其更容易出错。

下面的代码应该编译,并且应该处理边界情况,例如空输入urls切片。

package main

import (
    "fmt"
    "net/http"
    "os"
    "time"
)

const timeout time.Duration = 3 * time.Second

var urls = []string{
    "http://golang.org/",
    "http://stackoverflow.com/",
    "http://i.wanta.pony/", // Should error
}

type httpResponse struct {
    url      string
    response *http.Response
    err      error
}

func asyncHTTPGets(urls []string, ch chan *httpResponse) {
    for _, url := range urls {
        go func(url string) {
            resp, err := http.Get(url)
            ch <- &httpResponse{url, resp, err}
        }(url)
    }
}

func main() {
    responseCount := 0
    ch := make(chan *httpResponse)
    go asyncHTTPGets(urls, ch)
    for responseCount != len(urls) {
        select {
        case r := <-ch:
            if r.err != nil {
                fmt.Printf("Error %s fetching %s\n", r.err, r.url)
            } else {
                fmt.Printf("%s was fetched\n", r.url)
            }
            responseCount++
        case <-time.After(timeout):
            os.Exit(1)
        }
    }
}

Playground

答案 1 :(得分:0)

由于您使用的是无缓冲的频道,因此它会被阻止,直到网址被处理完毕。