2012-03-07 91 views
6

我在寫一個使用Akka 2期貨構建的CPU密集型應用程序。目前我不需要演員,但我不願意使用它們。Akka期貨並行隨機數生成

期貨中包含的幾個計算必須經常調用一個隨機生成器。我擔心,如果我使用經典的併發RNG,它將成爲一個窒息點,我將失去可擴展性。

什麼是在ExecutionContext每個線程有一個隨機生成器的最快/最簡單的方法?

有沒有辦法用不同的種子初始化它們(但事先已知)這樣的重複實驗?

回答

4

使用akka.jsr166y.ThreadLocalRandom

2

不要使用Scala隨機生成器;它只是一個你可能注意到的同步的Java包裝器。

Java 7有一個ThreadLocalRandom供您使用。如果你不能使用java 7使用另一個隨機數發生器;例如來自這裏的非同步的mersenna扭曲器實現:http://www.cs.gmu.edu/~sean/research/。通過一個ThreadLocal對象使用這個實現,以便每個線程有一個只能初始化一次。要爲實例播種,只需使用共享的普通同步隨機播放器。

4

如果使用ThreadLocalRandom不是一個選項,你可以很容易地使用ThreadLocal和斯卡拉的Random編寫自己的。雖然提供「額外的常用有界隨機生成方法」是一個練習留給感興趣的開發人員。

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

    def current = localRandom.get 
}