Как асинхронно выполнить будущее, которое предшествует другому будущему - PullRequest
0 голосов
/ 05 ноября 2019

Я делаю вложенные вызовы API. Конечный результат - несколько тысяч звонков. Конечный потребитель этого ожидает итератор, подобный следующему:

Iterator[Map[String,String]]

Я не хочу перебирать каждый листовой вызов перед передачей на следующий этап.

В следующем состоянии итератор используется другим методом, который вставляет каждый Map как строку в БД.

Поскольку Iterator может быть большим и содержать плохие строки, которые вызывают сбои,метод приема ingestIterator также возвращает Future

def ingestIterator(i: Iterator[Map[String,String]]): Seq[CustomFuture[Boolean]]

, поэтому все выглядит как

def getStates(url:String): List[String]

def getCounties(states: List[String]): List[String]

def getBlocks(stateCounties: List[String]): Iterator[Map[String,String]]

def getEverything(): Future[Iterator[Map[String, String]]]

, но ingestIterator хочет итератори я пытаюсь выяснить, какова наилучшая практика для вставки асинхронности в середину здесь.

1 Ответ

0 голосов
/ 05 ноября 2019

Если вы хотите вычислять каждый Map[String, String] только тогда, когда используется итератор результатов, то ваша обработка на самом деле последовательная, и, вероятно, вы не получите никакого повышения от фьючерсов.

На самом деле кажется, что вы хотите сочетание параллелизма и противодавления. Посмотрите на потоковые библиотеки, такие как fs2, zio-streams или akka-streams.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...