首页 > 解决方案 > 带有值列表的 Scala Futures 用于理解

问题描述

我需要同时对列表中的某些元素执行 Future 方法。我当前的实现是按顺序工作的,这对于节省时间并不是最佳的。我通过映射我的列表并在每个元素上调用方法并以这种方式处理数据来做到这一点。

我的经理与我分享了一个链接,展示了如何同时使用 Futures 执行,for-comprehension但我无法看到/理解如何使用我的List.

他与我分享的链接是https://alvinalexander.com/scala/how-use-multiple-scala-futures-in-for-comprehension-loop/

这是我当前的代码:

private def method1(id: String): Tuple2[Boolean, List[MyObject]] = {
    val workers = List.concat(idleWorkers, activeWorkers.keys.toList)
    var ready = true;
    val workerStatus = workers.map{ worker =>
      val option =  Await.result(method2(worker), 1 seconds)
      var status = if (option.isDefined) {
        if (option.get._2 == id) {
          option.get._1.toString
        } else {
          "INVALID"
        }
      } else "FAILED"
      val status = s"$worker: $status"
      if (option.get._1) {
        ready = false
      }
      MyObject(worker.toString, status)
    }.toList.filterNot(s => s. status.contains("INVALID"))
    (ready, workerStatus)
  }

  private def method2(worker: ActorRef): Future[Option[(Boolean, String)]] = Future{
      implicit val timeout: Timeout = 1 seconds;
      Try(Await.result(worker ? GetStatus, 1 seconds)) match {
            case Success(extractedVal) => extractedVal match {
                case res: (Boolean, String) => Some(res)
                case _ => None
            }
            case Failure(_) => { None }
            case _ => { None }
        }
  }

如果有人可以建议如何在这种情况下实现理解,我将不胜感激。谢谢

标签: scalaasync-awaitfuturefor-comprehension

解决方案


因为method2不需要Future/Await混合。只是:map_Future

def method2(worker: ActorRef): Future[Option[(Boolean, String)]] =
  (worker ? GetStatus).map{
      case res: (Boolean, String) => Some(res)
      case _ => None
    }

对于method1你同样需要对map结果进行method2内部处理map。这将产生workerStatus一个List[Future[MyObject]]并且意味着一切都并行运行。

然后用Future.sequence(workerStatus)List[Future[MyObject]]变成Future[List[MyObject]]. 然后,您可以再次使用map对它进行过滤/检查List[MyObject]。这将在所有个人Futures 完成后发生。

理想情况下,您将返回一个Futurefrommethod1以保持一切异步。如果绝对必要,您可以Await.result在此时使用它将等待所有异步操作完成(或失败)。


推荐阅读