跟踪已完成的期货

Thi*_*ijs 0 concurrency scala future scala-2.10

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

代码如下所示:

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

mis*_*ner 8

我建议使用标准的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)
Run Code Online (Sandbox Code Playgroud)

  • 如果您在Java 8上运行,[LongAdder](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html)可能会更高效. (4认同)
  • import java.util.concurrent.atomic.AtomicInteger; val a = new AtomicInteger(); a.incrementAndGet (2认同)