2012-03-07 26 views
6

Piszę aplikację intensywną CPU zbudowaną z wykorzystaniem Akka 2 Futures. Nie potrzebuję obecnie aktorów, ale nie jestem niechętny ich użyciu.Równoległe generowanie liczb losowych za pomocą Akka Futures

Kilka obliczeń zawartych w kontraktach terminowych musi często wywoływać generator losowy. Obawiam się, że jeśli użyję klasycznego współbieżnego RNG, stanie się to punktem dławiącym i stracę skalowalność.

Jaki jest najszybszy/najprostszy sposób posiadania generatora losowego na wątek w ExecutionContext?

Czy istnieje sposób na ich zainicjowanie za pomocą innego materiału siewnego (ale znanego z wyprzedzeniem) takiego powtórzenia eksperymentu?

Odpowiedz

4

Zastosowanie akka.jsr166y.ThreadLocalRandom

2

Nie używaj losowego generatora Scala; to po prostu opakowanie języka Java, które prawdopodobnie zauważyłeś, jest zsynchronizowane.

Java 7 ma ThreadLocalRandom, który jest stworzony do użytku. Jeśli nie możesz używać java 7, użyj innego randomizera; na przykład niezsynchronizowana implementacja twistera mersenna stąd: http://www.cs.gmu.edu/~sean/research/. Użyj tej implementacji za pomocą obiektu ThreadLocal, tak aby każdy wątek miał taki, który został zainicjowany tylko raz. Aby zaimplementować instancje, użyj zwykłej, zsynchronizowanej, losowej.

4

Jeśli nie używasz opcji ThreadLocalRandom, możesz łatwo napisać własną, używając ThreadLocal i Scala's Random. Chociaż udostępnianie "dodatkowych powszechnie stosowanych ograniczonych metod generowania losowego" jest ćwiczeniem pozostawionym zainteresowanemu programiście.

object ThreadLocalRandom { 
    private val localRandom = new ThreadLocal[util.Random] { 
    override protected def initialValue() = new util.Random 
    } 

    def current = localRandom.get 
} 
Powiązane problemy