2012-03-07 18 views
6

ile paralel rasgele sayı üretimi Akka 2 Futures ile oluşturulmuş CPU yoğun bir uygulama yazıyorum. Şu anda Aktörlere ihtiyacım yok ama onları kullanmakta isteksizim.Akka Futures

Gelecekte yer alan bazı hesaplamalar çok sık rastgele bir jeneratörü çağırmalıdır. Korkarım ki, klasik bir eş zamanlı RNG kullanırsam boğulma noktası olacak ve ölçeklenebilirliği kaybedeceğim.

ExecutionContext numaralı belgede her bir iş parçacığına rasgele bir üretime sahip olmanın en hızlı/basit yolu nedir?

Onları tekrarlamak için, farklı bir tohumla (ancak önceden bilinir) hepsini başlatmanın bir yolu var mı?

cevap

4

Kullanım akka.jsr166y.ThreadLocalRandom

2

Scala rasgele oluşturucuyu kullanmayın; Javas çevresinde muhtemelen fark ettiğinizi fark ettiğiniz bir sarıcıdır.

Java 7, kullanımınız için üretilmiş bir ThreadLocalRandom'a sahiptir. Java 7'yi kullanamazsanız başka bir rasgele kullanın; örneğin senkronize olmayan mersenna twister uygulaması buradan: http://www.cs.gmu.edu/~sean/research/. Bir ThreadLocal nesnesi aracılığıyla bu uygulamayı kullanın, böylece her iş parçacığının yalnızca bir kez başlatılan bir tane vardır. Örnekleri tohumlamak için sadece paylaşılan normal senkronize Rasgele kullanın.

4

ThreadLocalRandom kullanılıyorsa, ThreadLocal ve Scala'nın Random'u kullanarak kolayca yazabilirsiniz. Her ne kadar "yaygın olarak kullanılan sınırlı rasgele üretim yöntemleri" sunsa da, ilgili geliştiriciye bırakılan bir alıştırmadır.

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

    def current = localRandom.get 
}