如何避免遇到最大打开文件限制

时间:2017-08-01 17:06:35

标签: http networking go

我正在构建一个应用程序,该应用程序将使用go例程和纯粹的http get请求同时下载大约5000个CSV文件。并行下载文件。

我目前遇到OS X强加的开放文件限制。

CSV文件通过http提供。是否有任何其他网络协议可用于将每个请求合并为一个?我无法访问服务器,所以我无法压缩它们。我也不想改变ulimit,因为一旦投入生产,我可能无法访问该配置。

1 个答案:

答案 0 :(得分:3)

您可能希望将活动并发请求限制为比5000更合理的数字。可能会启动10/20工作人员并通过某个频道向他们发送单个文件。

http客户端重复使用请求连接,假设您始终读取整个请求正文,并将其关闭。

这样的事情:

func main() {
    http.DefaultTransport.(*http.Transport).MaxIdleConnsPerHost = 100
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go worker()
    }
    var csvs = []string{"http://example.com/a.csv", "http://example.com/b.csv"}
    for _, u := range csvs {
        ch <- u
    }
    close(ch)
    wg.Wait()
}

var ch = make(chan string)
var wg sync.WaitGroup

func worker() {
    defer wg.Done()
    for u := range ch {
        get(u)
    }
}

func get(u string) {
    resp, err := http.Get(u)
    //check err here

    // make sure we always read rest of body, and close
    defer resp.Body.Close()
    defer io.Copy(ioutil.Discard, resp.Body)

    //read and decode / handle it. Make sure to read all of body.
}