Предположим, у меня есть будущий результат, назовем его garfield
def garfield = Future{
Thread.sleep(100)
System.currentTimeMillis()
}
Я могу запустить garfield
одновременно с for comprehension
, как это
val f1 = garfield
val f2 = garfield
for {
r1 <- f1
r2 <- f2
} yield r1 -> r2
, как объяснено. в этот ответ.
Предположим, я не хочу загрязнять локальную область видимости будущими переменными, если они мне не понадобятся позже. Является ли это допустимым альтернативным подходом?
for {
f1 <- Future{garfield}
f2 <- Future{garfield}
r1 <- f1
r2 <- f2
} yield r1 -> r2
Редактировать
Похоже, мой оригинальный подход, использующий Future.apply
, включает в себя служебные данные, которые в большинстве случаев вызывают последовательное выполнение, см. пример .
Использование альтернативного подхода
for {
f1 <- Future.successful(garfield)
f2 <- Future.successful(garfield)
r1 <- f1
r2 <- f2
} yield r1 -> r2
ведет себя, как и ожидалось.
С другой стороны, этот подход немного странный и, возможно, более традиционный подход определения области видимости. Фьючерсы на Unit
предпочтительнее.
val res = {
val f1 = garfield
val f2 = garfield
for {
r1 <- f1
r2 <- f2
} yield r1 -> r2
}
Я ... ios, если кто-то может пролить немного света на причину спорадиального c отсутствия одновременного выполнения.