2014-03-24 3 views
4

네트워크 서비스 키/값 저장소에서 스레드 대량을 구현하기 위해 scala Futures를 사용하려고합니다. 스칼라 미래가 기다릴 수 없습니까?

대략

import scala.concurrent._ 
import scala.concurrent.ExecutionContext.Implicits.global 
import scala.concurrent.duration._ 

def bulkGet(keys: List[String]) 
    val listFut = keys.map(future{ "network get request here" }) 
    val values = Future.sequence(listFut) 

    Await.result(values, Duration(10, SECONDS)) 

나에게 내가 뭘 잘못 컴파일 오류

[info] Compiling 1 Scala source to .../target/scala-2.10/classes... 
[error] .... type mismatch; 
[error] found : scala.concurrent.Future[List[String]] 
[error] required: scala.concurrent.Awaitable[scala.concurrent.Future[List[String]]] 

[error]  Await.result(values, Duration(10, SECONDS)) 
         ^

을 제공합니다. 나는이 문서가 다시 다음입니다
: 어떻게 결과
http://docs.scala-lang.org/overviews/core/futures.html

scala.concurrent.Future가 정의 Awaitable에 의해 아닌가에 차단? 나는 그것을 어떻게 강요합니까?

답변

5

def의 본문을 블록에 넣고 future{ "network get request here" }_ => Future{ "network get request here" }으로 바꾸면이 코드가 컴파일되고 작동합니다. 문제는 코드의 다른 부분에 있습니다.

+0

감사합니다. 여전히 학습, 문제는 내가 메서드 (예를 들어 포함되지 않음), 마지막 줄에 대해 지정한 반환 형식을 것 같다 Await.result (...) –

1

저에게 맞습니다.

$ scala 
Welcome to Scala version 2.10.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_65). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

    import scala.concurrent.{Future, Await} 
    import scala.concurrent.ExecutionContext.Implicits.global 
    import scala.concurrent.duration.{Duration, SECONDS} 

    def bulkGet(keys: List[String]) = { 
    val listFut = keys.map(_ => Future("network get request here")) 
    val values = Future.sequence(listFut) 
    Await.result(values, Duration(10, SECONDS)) 
    } 

// Exiting paste mode, now interpreting. 

import scala.concurrent.{Future, Await} 
import scala.concurrent.ExecutionContext.Implicits.global 
import scala.concurrent.duration.{Duration, SECONDS} 
bulkGet: (keys: List[String])List[String] 

scala> bulkGet(List("foo", "bar", "baz")) 
res0: List[String] = List(network get request here, network get request here, network get request here) 
관련 문제