我正在编写一个使用 Akka 2 Futures 构建的 CPU 密集型应用程序。我目前不需要演员,但我并不不愿意使用它们。
包含在期货中的一些计算必须经常调用随机生成器。我担心如果我使用经典的并发 RNG,它会成为一个瓶颈,我会失去可扩展性。
中每个线程都有一个随机生成器的最快速/最简单的方法是ExecutionContext
什么?
有没有办法用不同的种子(但事先知道)初始化它们,比如重复实验?
如果 usingThreadLocalRandom
不是一个选项,您可以很容易地编写自己的 usingThreadLocal
和 Scala 的Random
. 尽管提供“其他常用的有界随机生成方法”是留给感兴趣的开发人员的练习。
object ThreadLocalRandom {
private val localRandom = new ThreadLocal[util.Random] {
override protected def initialValue() = new util.Random
}
def current = localRandom.get
}
使用 akka.jsr166y.ThreadLocalRandom
不要使用 Scala 随机生成器;它只是 Java 的一个包装器,您可能已经注意到它是同步的。
Java 7 有一个 ThreadLocalRandom 供您使用。如果您不能使用 java 7,请使用另一个随机发生器;例如这里的非同步 mersenna twister 实现:http ://www.cs.gmu.edu/~sean/research/ 。通过 ThreadLocal 对象使用此实现,以便每个线程都有一个只初始化一次的线程。要为实例播种,只需使用共享的正常同步 Random。