Ответ 1
Это потому, что у вас может быть до 1040 одновременных вызовов в вашем коде, поэтому вы вполне можете быть в состоянии с открытым диском 1040 и еще не закрыты.
Вам нужно ограничить количество используемых goroutines.
Здесь одно возможное решение с ограничением до 100 одновременных вызовов max:
func getThemAll() {
nbConcurrentGet := 100
urls := make(chan string, nbConcurrentGet)
for i := 0; i < nbConcurrentGet; i++ {
go func (){
for url := range urls {
get(url)
}
}()
}
for i:=0; i<1040; i++ {
urls <- fmt.Sprintf("http://www.httpbin.org/get?a=%d", i)
}
}
Если вы вызываете это в основной функции вашей программы, он может остановиться, прежде чем все задачи будут завершены. Вы можете использовать sync.WaitGroup
, чтобы предотвратить это:
func main() {
nbConcurrentGet := 100
urls := make(chan string, nbConcurrentGet)
var wg sync.WaitGroup
for i := 0; i < nbConcurrentGet; i++ {
go func (){
for url := range urls {
get(url)
wg.Done()
}
}()
}
for i:=0; i<1040; i++ {
wg.Add(1)
urls <- fmt.Sprintf("http://www.httpbin.org/get?a=%d", i)
}
wg.Wait()
fmt.Println("Finished")
}