2014-11-24 55 views
0

我正在Scala中产生大量(〜100.000)http请求任务作为期货。这需要一段时间,所以我希望能够通过增加一个全球计数器来跟踪这些期货有多少成功完成或失败。但是,我想要避免竞争条件。 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

你有没有想过为什么你的期货可能会失败。如果你在短时间内回复所有回复,该怎么办?你有资源来处理(“处理”)你的回应吗?如果没有,您的期货可能会因此而超时? – 2014-11-24 11:47:48

+0

@SoumyaSimanta,我不认为许多失败。如果失败,很可能是因为服务器没有响应。我只想跟踪进展情况。 – Thijs 2014-11-24 11:55:17

+0

这可能是期货不是你正在寻找的东西。你有没有想过一个演员,揣测计算?这可以让你做到这一点没有阻碍,但会让你围绕同步问题。 – 2014-11-24 12:27:41

回答

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) 
+4

如果您在Java 8上运行,[LongAdder](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html)可能更有效。 – lmm 2014-11-24 11:04:59

+0

我将如何在Scala中构造一个AtomicInteger?对不起,我对Scala还很陌生。 – Thijs 2014-11-24 11:53:11

+2

import java.util.concurrent.atomic.AtomicInteger; val a = new AtomicInteger(); a.incrementAndGet – 2014-11-24 11:58:24