2014-12-01 13 views
6

Mam bardzo prosty projekt MVV na wiosnę Maven i dodałem do niego Scalę. Chcę, aby następujące trzy futures były egzekwowane równocześnie, tak jak powinny. Jednak oni wykonać jedna po drugiejScala Futures nie działa równolegle

val viewName: Future[String] = for { 
    profileSync <- Future { EmployeeLocalServiceUtil.syncProfileInformation() } 
    earningsSync <- Future { EmployeeLocalServiceUtil.syncEarnings() } 
    reimbursementSync <- Future { EmployeeLocalServiceUtil.syncReimbursements() } 
} yield { 
    "employee/view" 
} 

Moja maszyna ma 4 rdzenie i używam scala.concurrent.ExecutionContext.Implicits.global kontekst. Poza tym nie ma konfiguracji, która mogłaby uniemożliwić/umożliwić równoległe wykonanie kontraktów futures.

Odpowiedz

8

Dla zrozumienia są to wyłącznie cukier syntaktyczny i są translated to flatMap like in Example 2.

Czyli kod będzie mniej więcej wyglądać tak:

Future { ??? }.flatMap { profileSync => 
    Future { ??? }.flatMap { earningsSync => 
    Future { ??? }.map { reimbursementSync => 
     // Able to access profileSync/earningsSync/reimbursementSync values. 
     "employee/view" 
    } 
    } 
} 

Jak widać Future s dopiero rusza po poprzednia zakończona. Aby obejść ten problem pierwszym uruchomieniu Future s, a następnie wykonaj dla zrozumienia:

val profileSyncFuture = Future { EmployeeLocalServiceUtil.syncProfileInformation()  } 
val earningsSyncFuture = Future { EmployeeLocalServiceUtil.syncEarnings()  } 
val reimbursementSyncFuture = Future { EmployeeLocalServiceUtil.syncReimbursements()  } 

val viewName: Future[String] = for { 
    profileSync <- profileSyncFuture 
    earningsSync <- earningsSyncFuture 
    reimbursementSync <- reimbursementSyncFuture 
} yield { 
    "employee/view" 
} 
+0

Thanks Akos do wyjaśnienia. Źle zrozumiałem to dla zrozumienia. – Robin

Powiązane problemy