복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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
    }
    

    그래서 처음 완성 된 미래 시도 (그래서, 성공 또는 실패)에 싸여 값을 설정합니다.

  4. from https://stackoverflow.com/questions/20659406/futures-success-race by cc-by-sa and MIT license