Mittwoch, 2. Juni 2010

Paralleles Primzahlsieb in Scala

Nach der Präsentation von Google Go habe ich mich gefragt ob man das parallele Primzahlsieb auch in Scala so machen kann. Ich muss sagen das ich das Resultat sogar einfacher und eleganter finde als die Go Implementation. Sicherlich gibt es performantere Algorithmen aber hier geht es einfach um das Prinzip zu zeigen wie einfach man Parallelisieren kann.

HINWEIS: Das Programm terminiert nicht, da für jede Primzahl ein eigener "Thread" (Actors die per react warten verhalten sich nicht ganz so wie Threads die in einem Loop warten, sondern sind leichtgewichtiger) gestartet wird und diese weiter auf Futter warten. Es ist auf jeden Fall möglich das das ganze anhält, ich will lediglich das Prinzip zeigen und das Beispiel nicht unnötig aufblasen.


import scala.actors.Actor
import scala.actors.Actor._

class Prime(value: Int) extends Actor {
var next: Option[Prime] = None

println(value)
start

def act(): Unit = loop {
react {
case x: Int if ((x % value) != 0) =>
next match {
case Some(p: Prime) => p ! x
case None => next = Some(new Prime(x))
}
}
}
}

object Main {
def main(args: Array[String]): Unit = {
val primer = new Prime(2)
3 to args(0).toInt map (primer ! _)
}
}

Keine Kommentare: