[SCALA] 선물과 스칼라의 "에 대한 이해"
SCALA선물과 스칼라의 "에 대한 이해"
내가 스칼라 요리 책을 읽고있다 (http://shop.oreilly.com/product/0636920026914.do)
이해를 위해 관련 미래의 사용과 관련된 예제가있다.
모음과 함께 사용이이 같은 유형의 다른 모음을 생성 할 때 지금까지 이해에 대한 나의 이해이다. 각 futureX 유형의 미래 [지능]의 경우, 예를 들어, 다음과 같은 형식이 미래되어야 [지능]
for {
r1 <- future1
r2 <- future2
r3 <- future3
} yield (r1+r2+r3)
이 코드에서 - 사람이 정확히 언제 사용 <일어나는 걸 설명 할 수 있을까요? 나는 그것이 발전기 인 경우는 반복하여 각 요소를 가져옵니다 알고있다.
해결법
-
==============================
1.이해에 대한 첫 번째. 지도, flatMap, withFilter : 그것은 모나드 작업의 몇 통해 추상화가 있다고, 많은 여러 번에 대답했다. 당신이 <사용하는 경우 - scalac는 모나드 flatMap에이 라인을 desugars :
이해에 대한 첫 번째. 지도, flatMap, withFilter : 그것은 모나드 작업의 몇 통해 추상화가 있다고, 많은 여러 번에 대답했다. 당신이 <사용하는 경우 - scalac는 모나드 flatMap에이 라인을 desugars :
R <- monad.flatMap에 모나드 (R => ...)
그것이 절대적으로 계산처럼 보이는 (모나드가 무엇인지에 관한 모든 것), 당신은 연구에 대한 계산 결과를 바인딩합니다. 그리고 수율 부분은지도 호출에 desugared된다. 결과 유형은 모나드의 유형에 따라 달라집니다.
우리는 그것과 이해를 위해 사용할 수 있도록 미래의 특성은 flatMap 및지도 기능이 있습니다. 당신의 예에서 다음과 같은 코드로 desugared 할 수 있습니다 :
future1.flatMap(r1 => future2.flatMap(r2 => future3.map(r3 => r1 + r2 + r3) ) )
그것은 future2의 실행이 R1에 의존하는 경우 다음 순차적 실행을 탈출 할 수있는 것은 물론,하지만 미래의 계산이 독립적 인 경우에, 당신은 두 가지 선택이있다. 당신은 순차적 인 실행을 적용, 또는 병렬 실행을 허용 할 수 있습니다. 실행 컨텍스트가이 문제를 처리 할대로, 후자를 적용 할 수 없습니다.
val res = for { r1 <- computationReturningFuture1(...) r2 <- computationReturningFuture2(...) r3 <- computationReturningFuture3(...) } yield (r1+r2+r3)
항상 순차적으로 실행됩니다. 그것은 쉽게 후속 computationReturningFutureX 호출 만 flatMaps 내부 호출 된 후 desugaring, 즉,에 의해 설명 할
computationReturningFuture1(...).flatMap(r1 => computationReturningFuture2(...).flatMap(r2 => computationReturningFuture3(...).map(r3 => r1 + r2 + r3) ) )
그러나이 병렬로 실행할 수 및 이해에 대한 결과를 집계 :
val future1 = computationReturningFuture1(...) val future2 = computationReturningFuture2(...) val future3 = computationReturningFuture3(...) val res = for { r1 <- future1 r2 <- future2 r3 <- future3 } yield (r1+r2+r3)
-
==============================
2.여기 기존의 답변을 이해 작품에 대한 방법을 설명하는 간단한 결과를 자세히 설명합니다.
여기 기존의 답변을 이해 작품에 대한 방법을 설명하는 간단한 결과를 자세히 설명합니다.
그 비트 긴 기능 아직에 그들은 가치가 촬영 모습.
우리에게 정수의 범위를 제공하는 함수
scala> def createIntegers = Future{ println("INT "+ Thread.currentThread().getName+" Begin.") val returnValue = List.range(1, 256) println("INT "+ Thread.currentThread().getName+" End.") returnValue } createIntegers: createIntegers: scala.concurrent.Future[List[Int]]
우리 문자의 범위를 제공하는 함수
scala> def createAsciiChars = Future{ println("CHAR "+ Thread.currentThread().getName+" Begin.") val returnValue = new ListBuffer[Char] for (i <- 1 to 256){ returnValue += i.toChar } println("CHAR "+ Thread.currentThread().getName+" End.") returnValue } createAsciiChars: scala.concurrent.Future[scala.collection.mutable.ListBuffer[Char]]
이해에 대한 내에서 이러한 함수 호출을 사용.
scala> val result = for{ i <- createIntegers s <- createAsciiChars } yield i.zip(s) Await.result(result, Duration.Inf) result: scala.concurrent.Future[List[(Int, Char)]] = Future(<not completed>)
라인 아래의이 위해 우리는 createIntegers의 실행을 완료 할 때까지 모든 함수 호출 즉 createAsciiChars 함수 호출이 실행되지 않습니다 동기되어 있다고 할 수 있습니다.
scala> INT scala-execution-context-global-27 Begin. INT scala-execution-context-global-27 End. CHAR scala-execution-context-global-28 Begin. CHAR scala-execution-context-global-28 End.
함축에 대한 비동기 실행됩니다 외부에서 이러한 기능 createAsciiChars 만들기, createIntegers 호출합니다.
-
==============================
3.그것은 가능하면 R1은, R2, R3는 병렬로 실행할 수 있습니다. 이 일이 미래의 계산을 실행할 수 있습니다 얼마나 많은 스레드처럼 따라하지만,이 구문을 사용하여 모든 완료 한 후 수율 () 실행 가능하면 병렬로 이러한 계산을 실행하기 위해 컴파일러를 말하고있다, 가능하지 않을 수 있습니다.
그것은 가능하면 R1은, R2, R3는 병렬로 실행할 수 있습니다. 이 일이 미래의 계산을 실행할 수 있습니다 얼마나 많은 스레드처럼 따라하지만,이 구문을 사용하여 모든 완료 한 후 수율 () 실행 가능하면 병렬로 이러한 계산을 실행하기 위해 컴파일러를 말하고있다, 가능하지 않을 수 있습니다.
from https://stackoverflow.com/questions/19045936/scalas-for-comprehension-with-futures by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 스칼라에서 "새로운"키워드 (0) | 2019.11.08 |
---|---|
[SCALA] 스칼라 모음으로 자바 컬렉션을 변환 (0) | 2019.11.08 |
[SCALA] 언제, 왜 하나는 스칼라에서 실용적 펑터를 사용한다 (0) | 2019.11.08 |
[SCALA] 어떻게 미래를위한 미세 조정 스레드 풀을 구성하는 방법? (0) | 2019.11.07 |
[SCALA] 스칼라 : 목록 [미래] 미래 [목록]에 실패 미래를 무시 (0) | 2019.11.07 |