Представим, что у нас есть некоторая функция, для выполнения которой требуется некоторое время.
С помощью Future.traverse
мы можем применить данную функцию для некоторого списка данных. При этом выполнив конкурентный (это не значит параллельный) запуск фьюч.
В функции slowCalculation
вместо Thread.sleep(1000)
может быть все что угодно. Например, обращение в базу данных или поход в некоторый сервис. Так же может произойти такая ситуация, что размер списка someData
может быть равен не 4, а 400000. И поскольку Future
жадная, то у нас запуститься 400000 прожорливых фьюч. Это может привести к непредвиденным последствиям (кстати, это отличный способ заддосить свой внутренний или внешний сервис).
Чтобы обезопасить себя от такого поведения напишем функцию batchTraverse
для порционного применения функции к списку данных.
После чего можем запустить функцию порционно по 10 штук пока не будет обработан весь список.
- Примечание: в ходе экспериментов не забывайте о контексте, в котором будет производиться запуск фьюч. А лучше создать свой
ExecutionContext
с фиксированным размером пула потоков.