У вас есть несколько вариантов.
Существует целое семейство функций группировки grouped(Int)
, groupWithin(Int, FiniteDuration)
, и c, которые вы можете использовать для создания коллекции элементов, генерируемых до тех пор, пока не будет достигнут некоторый порог. заполнено и / или в пределах временного окна, et c. Как только у вас есть этот пакет, вы можете mapAsync
его, и там вы можете использовать некоторый детальный контроль над Future, например, вы можете создать Future
для каждого элемента, объединить их с Future.sequence
и отобразить результат параллельных операций.
stream
.grouped(10)
.mapAsync(1) { collection =>
// create future processing all values in collection at once
}
Если у вас нет проблем с обработкой более чем одного пакета одновременно, вы можете увеличить параллелизм в mapAsync
. Если вам не нужно каким-либо образом комбинировать сгруппированные значения, возможно, для ваших нужд будет достаточно mapAsync
с более высоким параллелизмом (или mapAsyncUnordered
).
Вы должны помнить, что эти значения в обоих grouped и в mapAsyn c должны быть настроены разумно, потому что, например, если вы попытаетесь сгруппировать 1M элементов, вы можете столкнуться с ошибками OOM.