[SCALA] 선물 / 성공 경주
SCALA선물 / 성공 경주
나는 미래를 배우고, 나는, 매개 변수로 두 개의 선물을하는 방법을 만들려고 해요 (F 및 G) 및 그렇지 않으면 또는 g f를 반환 성공적으로 완료 한 제 1 장래를 반환합니다.
일부 사용 사례 내 메소드의 동작을 설명하기 위해 다음과 같습니다
Future 1 | Future 2 | Result
Success First Success Second Future 1
Success First Failure Second Future 1
Success Second Success First Future 2
Success Second Failure First Future 1
Failure First Failure Second Future 2 (because we had a failure on Future 1, so try to see what is the result Future 2)
그래서 나는이 방법을 만들어 :
def successRace(f: Future[T], g: Future[T]): Future[T] = {
val p1 = Promise[T]()
val p2 = Promise[T]()
val p3 = Promise[T]()
p1.completeWith(f)
p2.completeWith(g)
p3. ????
p3.future
}
그리고 지금, 내가 어떻게 하나가 먼저 완료된 알 수 있는가?
해결법
-
==============================
1.사용 케이스는 최초의 성공적인 완료입니다 :
사용 케이스는 최초의 성공적인 완료입니다 :
scala> :pa // Entering paste mode (ctrl-D to finish) def firstSuccessOf[T](fs: Future[T]*)(implicit x: ExecutionContext): Future[T] = { val p = Promise[T]() val count = new java.util.concurrent.atomic.AtomicInteger(fs.size) def bad() = if (count.decrementAndGet == 0) { p tryComplete new Failure(new RuntimeException("All bad")) } val completeFirst: Try[T] => Unit = p tryComplete _ fs foreach { _ onComplete { case v @ Success(_) => completeFirst(v) case _ => bad() }} p.future } // Exiting paste mode, now interpreting. firstSuccessOf: [T](fs: scala.concurrent.Future[T]*)(implicit x: scala.concurrent.ExecutionContext)scala.concurrent.Future[T]
그래서
scala> def f = Future { Thread sleep 5000L ; println("Failing") ; throw new NullPointerException } f: scala.concurrent.Future[Nothing] scala> def g = Future { Thread sleep 10000L ; println("OK") ; 7 } g: scala.concurrent.Future[Int] scala> firstSuccessOf(f,g) res3: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@5ed53f6b scala> res0Failing 3.value res4: Option[scala.util.Try[Int]] = None scala> res3.valueOK res5: Option[scala.util.Try[Int]] = Some(Success(7))
또는
scala> def h = Future { Thread sleep 7000L ; println("Failing too") ; throw new NullPointerException } h: scala.concurrent.Future[Nothing] scala> firstSuccessOf(f,h) res10: scala.concurrent.Future[Nothing] = scala.concurrent.impl.Promise$DefaultPromise@318d30be scala> scala> res10.Failing value res11: Option[scala.util.Try[Nothing]] = None scala> Failing too scala> res10.value res12: Option[scala.util.Try[Nothing]] = Some(Failure(java.lang.RuntimeException: All bad))
@ ysusuk의 대답은 Future.firstCompletedOf은 후드 아래 않는 것입니다.
-
==============================
2.당신은 tryCompleteWith 방법을 사용하고 싶습니다. 그것은 여러 번하고 첫 번째 완료 미래의 승리를 호출 할 수 있습니다.
당신은 tryCompleteWith 방법을 사용하고 싶습니다. 그것은 여러 번하고 첫 번째 완료 미래의 승리를 호출 할 수 있습니다.
def successRace(f: Future[T], g: Future[T]): Future[T] = { val p = Promise[T]() p.tryCompleteWith(f) p.tryCompleteWith(g) p.future }
-
==============================
3.나는 완전히 이전의 대답에 동의, 아직 난 내 예, 그래서 더 그것을 조금 명확히 바랍니다 :
나는 완전히 이전의 대답에 동의, 아직 난 내 예, 그래서 더 그것을 조금 명확히 바랍니다 :
def successRace[T](f: Future[T], g: Future[T]): Future[T] = { val promise = Promise[T]() f onComplete(promise.tryComplete(_)) g onComplete(promise.tryComplete(_)) promise.future }
그래서 처음 완성 된 미래 시도 (그래서, 성공 또는 실패)에 싸여 값을 설정합니다.
from https://stackoverflow.com/questions/20659406/futures-success-race by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 스칼라의 경우 클래스 개인 생성자하지만 대중은 방법을 적용 (0) | 2020.02.15 |
---|---|
[SCALA] 왜 NullPointerException이에서 UDF 결과에서 DataFrame를 accesing? (0) | 2020.02.08 |
[SCALA] 익명 함수를 정의하기 위해 밑줄을 결정할 수있는 규칙은 무엇입니까? (0) | 2020.01.15 |
[SCALA] 계산 코사인 유사성 스파크 Dataframe (0) | 2020.01.15 |
[SCALA] 어떻게 스칼라에서 문자열 "+"연산자를 unimport하는? (0) | 2020.01.11 |