2014-11-24 2 views
0

저는 스칼라에서 Futures로 많은 수의 (~ 100.000) http 요청 태스크를 생성합니다. 이 작업은 시간이 걸리기 때문에 글로벌 카운터를 증가시킴으로써 얼마나 많은 선물이 성공적으로 완료되었거나 실패했는지 추적 할 수 있기를 바랍니다. 그러나 경쟁 조건을 피하기를 원합니다. 스칼라에 원자 카운터를 만드는 옵션이 있습니까? 아니면 더 좋은 방법이 있습니까?완료된 미래를 추적하십시오

코드는 다음과 같습니다

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

"당신의 선물"이 실패 할 수 있다고 생각 했습니까? 짧은 응답 시간 내에 모든 답장을 다시 받으려면 어떻게해야할까요? 응답을 처리 (처리) 할 수있는 리소스가 있습니까? 그렇지 않다면, 당신의 선물은 그로 인해 시간 초과 될 수 있습니까? –

+0

@SoumyaSimanta, 나는 많은 것이 실패했다고 생각하지 않는다. 실패 할 경우 서버가 응답하지 않았을 가능성이 큽니다. 나는 단지 진도를 추적하고 싶다. – Thijs

+0

선물이 당신이 찾고있는 것이 아닐 수도 있습니다. 당신은 배우를 생각해 봤나? 그렇게하면 차단하지 않고도 할 수 있지만 동기화 문제를 해결할 수 있습니다. –

답변

8

나는 표준 자바 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

+0

스칼라에서 어떻게 AtomicInteger를 만들 수 있습니까? 미안 해요, 저는 여전히 스칼라에 대해 아주 새롭습니다. – Thijs

+2

가져 오기 java.util.concurrent.atomic.AtomicInteger; val a = 새로운 AtomicInteger(); a.incrementAndGet –

관련 문제