цикла функции запускаю горутины
...
ch := make(chan []Issue)
for i := 0; i < countCalls; i++ {
wg.Add(1)
go CarriageAPICall(ch, offset)
offset += 100
// var issues []Issue
issues = append(issues, <- ch...)
}
функция CarriageAPICall:
- обращается за данными к API
- пишет полученные данные в канал
после каждой итерации хочу читать полученные данные с канала и аппендить их в массив
сама проблема:
горутины работают не параллельно, а в порядки очереди.
Но если вынести issues = append(issues, <- ch...) за пределы цикла, горутины начинают работать параллельно, но возникает другая проблема.
как можно это пофиксить? и почему это происходит?
буду крайне признателен любому совету
У вас классическая задача, прям из книжки по go, вам нужен отдельная горотина в которой просиходит wg.wait и close каналу
вот тут пример https://github.com/adonovan/gopl.io/blob/b725d6015f980e94734da37e35ba0d943fc7532f/ch8/thumbnail/thumbnail_test.go#L117
У вас канал небуферизованный. Писатели блокируются на записи в него, если там уже что-то есть
Обсуждают сегодня