bit_rainbow
@bit_rainbow

Как в Scala сделать 1000 запросов и сложить общий результат?

В Скале я пару дней. После доки осталось недопонимание.

Есть, например урл, user/info/:id по которому выдаться однородные данные.

Мне нужно отослать 1000 запросов типа: user/info/1, user/info/2, user/info/1000
и слить результат воедино.

Последовательно - слишком медленно.

Сделал так:
====
val u1 = Future {
            ..... do request
    }

    val u1000 = Future {
            ..... do request
    }

    val req = Future.sequence(Seq(u1, u2, u1000))
    var result = Await.result(req, duration)


1. Future.sequence(Seq(u1, u2, u1000)) начет выполнение Future параллельно или последовательно? Если параллельно, то в скольки потоках?

2. Правильно лия понимаю что Await.result(req, duration) делает на блокировку до тех пор пока не будет закончены все Future.

3. Как ускорить код?
  • Вопрос задан
  • 182 просмотра
Пригласить эксперта
Ответы на вопрос 2
mrRontgen
@mrRontgen
Scala lover.
Добрый день)

В таком виде любое решение будет костылем. Лучше всего использовать парадигму Akka Streams.

i) Создаете Source в котором будет все возможные запросы
ii) Создаете Flow который будет слать запросы параллельно. Можно Map использовать, там можно указать кол-во потоков.
iii) Создаете Sink который будет аккумулировать ответы.
iv) На выходе получите один Future со всеми ответами.
v) Профит) Более подробно тут.
Ответ написан
Комментировать
1) sequence не начнет выполнение фьюч. Фьючи начинаю исполняться в момент создания, т.е. ещё до sequence.
2) Правильно. Только у вас ещё и тайм-аут есть. Так делать не очень то хорошо. Используйте onComplete/map
3) Вам лучше глянуть на ParSeq для этой задачи.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы