gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:32:22 25 4
gpt4 key购买 nike

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

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

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

最佳答案

您可能希望将事件并发请求限制在比 5000 更合理的数量。可能启动 10/20 工作人员并通过 channel 向他们发送单个文件。

假设您总是读取整个请求正文并将其关闭,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.
}

关于http - 如何避免遇到最大打开文件限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45443848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com