【问题标题】:Keep track of completed Futures跟踪已完成的期货
【发布时间】:2014-11-24 10:52:09
【问题描述】:

我在 Scala 中生成了大量(~100.000)http-request 任务作为期货。这需要一段时间,所以我希望能够通过增加全局计数器来跟踪这些期货中有多少是成功完成或失败的。但是,我想避免竞争条件。 Scala 中是否有制作原子计数器的选项?还是有更好的方法?

代码如下所示:

val futures = for(i <- 0 until nSteps) yield future {
    ...
    val content = blocking { ... http request ... }
    process(content)
}
Await.result(Future.sequence(futures),2 hours)

【问题讨论】:

  • 您是否想过“为什么”您的 Futures 可能会失败。如果您在很短的时间内收到所有回复怎么办。您是否有资源来处理(“处理”)您的回复?如果没有,您的 Futures 可能会因此而超时?
  • @SoumyaSimanta,我不认为很多人会失败。如果它们失败,很可能是因为服务器没有响应。我只是想跟踪进度。
  • 期货可能不是你要找的东西。你有没有想过一个演员,对计算进行分析?这将允许您在不阻塞的情况下执行此操作,但可以解决同步问题。

标签: scala concurrency future scala-2.10


【解决方案1】:

我建议使用标准 Java AtomicInteger。您可以使用incrementAndGet() 方法递增它,并通过其get() 方法获取当前值。

import java.util.concurrent.atomic.AtomicInteger
...
val completed = new AtomicInteger()
val futures = for(i <- 0 until nSteps) yield future {
    ...
    val content = blocking { ... http request ... }
    process(content)
    completed.incrementAndGet()
}
Await.result(Future.sequence(futures),2 hours)
...
print("Completed: %d" format completed.get)

【讨论】:

  • 如果您在 Java 8 上运行,LongAdder 可能更高效。
  • 如何在 Scala 中构造 AtomicInteger?抱歉,我对 Scala 还是很陌生。
  • 导入 java.util.concurrent.atomic.AtomicInteger; val a = new AtomicInteger(); a.incrementAndGet
  • 哦,是的,我应该在我的回答中包含这个。风格上的评论:虽然a.incrementAndGet 是合法的,但应该首选a.incrementAndGet() 以强调其副作用(参见docs.scala-lang.org/style/method-invocation.html#arity-0
猜你喜欢
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
  • 2012-09-21
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多