zoukankan      html  css  js  c++  java
  • 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 PiMessage
    10         case object Calculate extends PiMessage
    11         case class Work(stat:Int, nrOfElements: Int) extends PiMessage
    12         case class Result(value: Double) extends PiMessage
    13         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.0
    18                         for(i<- start until (start + nrOfElements))
    19                                 acc += 4.0 * (1 - (i%2) * 2) / (2 * i + 1)
    20                         acc
    21                 }
    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.currentTimeMillis
    35 
    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 += value
    46                                 nrOfResults += 1
    47                                 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("	pi approximation: 		%s
    	Calculation time: 	%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 ! Calculate
    65         }
    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 clean
    12 
    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/bash
    3 
    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

  • 相关阅读:
    Leetcode 16.25 LRU缓存 哈希表与双向链表的组合
    Leetcode437 路径总和 III 双递归与前缀和
    leetcode 0404 二叉树检查平衡性 DFS
    Leetcode 1219 黄金矿工 暴力回溯
    Leetcode1218 最长定差子序列 哈希表优化DP
    Leetcode 91 解码方法
    Leetcode 129 求根到叶子节点数字之和 DFS优化
    Leetcode 125 验证回文串 双指针
    Docker安装Mysql记录
    vmware虚拟机---Liunx配置静态IP
  • 原文地址:https://www.cnblogs.com/Torstan/p/4156440.html
Copyright © 2011-2022 走看看