scala - 带有值列表的 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 }
}
}
如果有人可以建议如何在这种情况下实现理解,我将不胜感激。谢谢
解决方案
因为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]
。这将在所有个人Future
s 完成后发生。
理想情况下,您将返回一个Future
frommethod1
以保持一切异步。如果绝对必要,您可以Await.result
在此时使用它将等待所有异步操作完成(或失败)。
推荐阅读
- ios - 我应该在我的 tableview 中使用 4 xib 还是使用 4 个不同的 tableview
- c# - 在不更改服务合同的情况下获得 Async/Await 的服务器端优势
- wordpress - 如何修复错误“灯塔返回错误:NO_FCP。” 安装缓存模块后,由我的网站“Wordpress”上的“PageSpeed Insights”返回
- c++ - 正确删除 с++ 中的类
- asp.net-core - 使用 autofac 将属性注入到扩展类中
- python - 在python中读取csv文件
- python - 如何在python中编写逻辑增长模型?
- sql - sql将查询转发到teradata?
- html - 使用 box-shadow 或任何 css 技巧更改样式
- scala - Scala 标准库中从 Any 到 Unit 的常量函数