Added some comments and scaladoc to Pi tutorial sample
This commit is contained in:
parent
0149cb3fee
commit
d859a9cb13
1 changed files with 34 additions and 4 deletions
|
|
@ -14,29 +14,48 @@ import akka.dispatch.Dispatchers
|
||||||
import System.{currentTimeMillis => now}
|
import System.{currentTimeMillis => now}
|
||||||
import java.util.concurrent.CountDownLatch
|
import java.util.concurrent.CountDownLatch
|
||||||
|
|
||||||
object Main extends App {
|
/**
|
||||||
Pi.calculate
|
* Sample for Akka, SBT an Scala tutorial.
|
||||||
}
|
* <p/>
|
||||||
|
* Calculates Pi.
|
||||||
|
* <p/>
|
||||||
|
* Run it in SBT:
|
||||||
|
* <pre>
|
||||||
|
* $ sbt
|
||||||
|
* > update
|
||||||
|
* > console
|
||||||
|
* > akka.tutorial.sbt.pi.Pi.calculate
|
||||||
|
* > ...
|
||||||
|
* > :quit
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||||
|
*/
|
||||||
object Pi {
|
object Pi {
|
||||||
val nrOfWorkers = 4
|
val nrOfWorkers = 4
|
||||||
val nrOfMessages = 10000
|
val nrOfMessages = 10000
|
||||||
val nrOfElements = 10000
|
val nrOfElements = 10000
|
||||||
|
|
||||||
|
// ====================
|
||||||
// ===== Messages =====
|
// ===== Messages =====
|
||||||
|
// ====================
|
||||||
sealed trait PiMessage
|
sealed trait PiMessage
|
||||||
case class Calculate(nrOfMessages: Int, nrOfElements: Int) extends PiMessage
|
case class Calculate(nrOfMessages: Int, nrOfElements: Int) extends PiMessage
|
||||||
case class Work(arg: Int, fun: (Int) => Double) extends PiMessage
|
case class Work(arg: Int, fun: (Int) => Double) extends PiMessage
|
||||||
case class Result(value: Double) extends PiMessage
|
case class Result(value: Double) extends PiMessage
|
||||||
|
|
||||||
|
// ==================
|
||||||
// ===== Worker =====
|
// ===== Worker =====
|
||||||
|
// ==================
|
||||||
class Worker extends Actor {
|
class Worker extends Actor {
|
||||||
def receive = {
|
def receive = {
|
||||||
case Work(arg, fun) => self reply Result(fun(arg))
|
case Work(arg, fun) => self reply Result(fun(arg))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ==================
|
||||||
// ===== Master =====
|
// ===== Master =====
|
||||||
|
// ==================
|
||||||
class Master(latch: CountDownLatch) extends Actor {
|
class Master(latch: CountDownLatch) extends Actor {
|
||||||
var pi: Double = _
|
var pi: Double = _
|
||||||
var nrOfResults: Int = _
|
var nrOfResults: Int = _
|
||||||
|
|
@ -59,6 +78,7 @@ object Pi {
|
||||||
results.sum
|
results.sum
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// message handler
|
||||||
def receive = {
|
def receive = {
|
||||||
case Calculate(nrOfMessages, nrOfElements) =>
|
case Calculate(nrOfMessages, nrOfElements) =>
|
||||||
// schedule work
|
// schedule work
|
||||||
|
|
@ -68,6 +88,7 @@ object Pi {
|
||||||
router ! Broadcast(PoisonPill)
|
router ! Broadcast(PoisonPill)
|
||||||
|
|
||||||
case Result(value) =>
|
case Result(value) =>
|
||||||
|
// handle result from the worker
|
||||||
pi += value
|
pi += value
|
||||||
nrOfResults += 1
|
nrOfResults += 1
|
||||||
if (nrOfResults == nrOfMessages) self.stop
|
if (nrOfResults == nrOfMessages) self.stop
|
||||||
|
|
@ -76,12 +97,17 @@ object Pi {
|
||||||
override def preStart = start = now
|
override def preStart = start = now
|
||||||
|
|
||||||
override def postStop = {
|
override def postStop = {
|
||||||
|
// tell the world that the calculation is complete
|
||||||
EventHandler.info(this, "\n\tPi estimate: \t\t%s\n\tCalculation time: \t%s millis".format(pi, (now - start)))
|
EventHandler.info(this, "\n\tPi estimate: \t\t%s\n\tCalculation time: \t%s millis".format(pi, (now - start)))
|
||||||
latch.countDown
|
latch.countDown
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ==================
|
||||||
|
// ===== Run it =====
|
||||||
|
// ==================
|
||||||
def calculate = {
|
def calculate = {
|
||||||
|
// this latch is only plumbing to know when the calculation is completed
|
||||||
val latch = new CountDownLatch(1)
|
val latch = new CountDownLatch(1)
|
||||||
|
|
||||||
// create the master
|
// create the master
|
||||||
|
|
@ -95,3 +121,7 @@ object Pi {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// To be able to run it as a main application
|
||||||
|
object Main extends App {
|
||||||
|
Pi.calculate
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue