посоветовали errgroup - помогло, сделал так
for i, ticker := range tickers {
i, ticker := i, ticker
g.Go(func() error {
eod, err := GetInfo(ticker.TickerID)
if err == nil {
eods[i] = eod
}
return err
})
}
if err := g.Wait(); err != nil {
return err
}
Но теперь уперся в огрничение http соединений (socket: too many open files)
Есть мысль дробить массив tickers на чанки и выполнять кусок кода выше в цикле. Норм решение?
А что за утечки при рутинах в цикле? Можно пояснить? Я, видать, не в курсе…
Ну той мой бок был, я изначально писал ошибки в отдельный канал, который никто не читал, был только возврат из ф-ции return <-errorChannel, и собственно начинало виснуть, вот и узнал потом про errgroup
Ulimit -n 10000
rlimit_nofile
ага, попробовал сейчас вот так var rLimit syscall.Rlimit err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit) if err != nil { fmt.Println("Error Getting Rlimit ", err) } rLimit.Max = 999999 rLimit.Cur = 999999 err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit) if err != nil { panic(err) } получаю invalid argument
Обсуждают сегодня