Предположим, у меня есть несколько задач, которые я хочу выполнять параллельно.
Каждая задача (метод) имеет внутреннюю рекурсивную функцию, которая в основном извлекает данные из базы данных и сохраняет их в некотором хранилище данных.
[упрощенная внутренняя рекурсивная функция]
def simplifiedSomeTask(): Unit = {
@scala.annotation.tailrec
def get(
stream: Stream[SomeEntity],
result: Seq[SomeEntity],
): Stream[SomeEntity] = result match {
case Nil =>
stream
case _ =>
val query = //query to fetch data from database
get(
stream append result.toStream,
query.run.value, // get fetched data from database
)
}
val buffer = collection.mutable.Map.empty[String, String]
get(
Stream.empty,
query.run.value
).foreach { r =>
buffer.put(r.loginId, r.userId)
}
}
При попытке запустить A, Future никогда не завершается по какой-то причине.
[A]
val f1 =Future { someTask1() }
val f2 =Future { someTask2() }
val f3 =Future { someTask3() }
val f = for {
_ <- f1
_ <- f2
_ <- f3
} yield ()
Await.result(f, Duration.Inf)
Однако, B работает (хотя он не работает параллельно)
[B]
val f = for {
_ <- Future { someTask1() }
_ <- Future { someTask2() }
_ <- Future { someTask3() }
} yield ()
Await.result(f, Duration.Inf)
Как мне изменить A, чтобы он работал как положено?