我正在构建一个应用程序,该应用程序将使用go例程和纯粹的http get请求同时下载大约5000个CSV文件。并行下载文件。
我目前遇到OS X强加的开放文件限制。
CSV文件通过http提供。是否有任何其他网络协议可用于将每个请求合并为一个?我无法访问服务器,所以我无法压缩它们。我也不想改变ulimit,因为一旦投入生产,我可能无法访问该配置。
答案 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.
}