我在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)
答案 0 :(得分: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)