首页 > 代码库 > akka简单示例-2
akka简单示例-2
手动敲了一遍计算pi的示例:http://www.gtan.com/akka_doc/intro/getting-started-first-scala.html
有个笔误,花了半个小时定位。
1 [Torstani@sparkb5-i ~/akka_example/pi]$ cat src/Pi.scala 2 package akka.tutorial.first.scala 3 import akka.actor._ 4 import akka.routing.RoundRobinRouter 5 import scala.concurrent.duration._ 6 7 object Pi extends App{ 8 calculate(nrOfWorkers=4, nrOfElements=1000, nrOfMessages=10000) 9 sealed trait PiMessage10 case object Calculate extends PiMessage11 case class Work(stat:Int, nrOfElements: Int) extends PiMessage12 case class Result(value: Double) extends PiMessage13 case class PiApproximation(pi: Double, duration: Duration)14 15 class Worker extends Actor{16 def calculatePiFor(start: Int, nrOfElements: Int):Double = {17 var acc = 0.018 for(i<- start until (start + nrOfElements))19 acc += 4.0 * (1 - (i%2) * 2) / (2 * i + 1)20 acc21 }22 def receive = {23 case Work(start, nrOfElements) =>24 //println("worker received "+start + ":"+nrOfElements)25 val res = calculatePiFor(start, nrOfElements)26 sender ! Result(res)27 //println("worker send result: "+res)28 }29 }30 31 class Master(nrOfWorkers:Int, nrOfMessages:Int, nrOfElements: Int, listener: ActorRef) extends Actor {32 var pi:Double = _33 var nrOfResults:Int= _34 val start:Long = System.currentTimeMillis35 36 val workerRouter = context.actorOf(37 Props[Worker].withRouter(RoundRobinRouter(nrOfWorkers)), name="workerRouter")38 def receive = {39 case Calculate =>40 //println("master receive Calculate")41 for(i <- 0 until nrOfMessages) 42 workerRouter ! Work(i*nrOfElements, nrOfElements)43 case Result(value) =>44 //println("master recieve result: "+value)45 pi += value46 nrOfResults += 147 if(nrOfResults == nrOfMessages){48 listener ! PiApproximation(pi, duration=(System.currentTimeMillis - start).millis)49 context.stop(self)50 }51 }52 }53 class Listener extends Actor{54 def receive = {55 case PiApproximation(pi, duration) =>56 println("\tpi approximation: \t\t%s\n\tCalculation time: \t%s".format(pi, duration))57 context.system.shutdown()58 }59 }60 def calculate(nrOfWorkers:Int, nrOfElements:Int, nrOfMessages:Int) = {61 val system = ActorSystem("PiSystem")62 val listener = system.actorOf(Props[Listener], name="listener")63 val master = system.actorOf(Props(new Master(nrOfWorkers, nrOfMessages, nrOfElements, listener)), name="master")64 master ! Calculate65 }66 }
1 [Torstan@sparkb5-i ~/akka_example/pi]$ cat Makefile 2 SRC_DIR := src 3 SRC := $(shell find ${SRC_DIR} -name "*.scala") 4 DIR=remote 5 6 TARGET := HelloRemote.jar 7 8 SCALAC := scalac 9 SCFLAGS := /usr/local/scala-2.10.4/lib/akka-actors.jar 10 11 .PHONY: all clean12 13 all: ${TARGET}14 15 ${TARGET}: ${SRC}16 ${SCALAC} -cp ${SCFLAGS} $^17 18 clean:19 ${RM} -r ${TARGET} ${DIR}
1 [Torstan@sparkb5-i ~/akka_example/pi]$ cat run.sh 2 #!/bin/bash3 4 AKKA_LIB_PATH="/usr/local/akka-2.1.4/lib/akka/"5 6 java -cp 7 .:/usr/local/scala-2.10.4/lib/scala-library.jar:/usr/local/scala-2.10.4/lib/akka-actors.jar:/usr/local/scala-2.10.4/lib/typesafe-config.jar:${AKKA_LIB_PATH}/akka-remote_2.10-2.1.4.jar:${AKKA_LIB_PATH}/protobuf-java-2.4.1.jar:${AKKA_LIB_PATH}/netty-3.5.8.Final.jar 8 akka.tutorial.first.scala.Pi
执行结果:
[Torstan@sparkb5-i ~/akka_example/pi]$ ./run.sh
pi approximation: 3.1415925535897866
Calculation time: 383 milliseconds
akka简单示例-2
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。