我在 Scala 中生成大量 (~100.000) http-request 任务作为 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)
我建议使用标准的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)