• akka 入门例子


    来自akka官方文档。

    import akka.actor._
    import akka.routing.RoundRobinRouter
    import akka.util._
    import scala.concurrent.duration._
     
    
    object Pi extends App {  
      
      def caculate (nrOfWorks:Int, nrOfMessage:Int, nrOfElement:Int){
        val system = ActorSystem("PiSystem")
        val listener = system.actorOf(Props[Listener], name="listener")
        val master = system.actorOf(Props(new Master(nrOfWorks,nrOfMessage,nrOfElement,listener)), name="master")
         master ! Caculate 
      }
      caculate (4, 10000, 10000)
    }
    
    
    sealed trait PiMessager
    case object Caculate extends PiMessager
    case class Work(start:Int, nrOfElements:Int) extends PiMessager
    case class Result(value:Double) extends PiMessager
    case class PiApproxomation(pi:Double, duration:Duration)
    
    class Worker extends Actor{
      
      def receive = {
        case Work(start,nrOfElements) => sender ! Result(calculatePiFor(start, nrOfElements))
      }
      
      
      def calculatePiFor(start:Int, nrOfElements:Int):Double ={
        var acc = 0.0
        for(i <- start until (start + nrOfElements)){
          acc += 4.0 * (1- (i%2)*2)/(2*i+1)
        }
        acc    
      }
    }
    
    class Master (nrOfWorks:Int, nrOfMessage:Int, nrOfElement:Int, listener:ActorRef) extends Actor
    {
      var pi: Double = _
      var nrOfResults: Int = _
      val start: Long = System.currentTimeMillis()
      
      val workerRouter = context.actorOf(
          Props[Worker].withRouter(RoundRobinRouter(nrOfWorks)), name = "workerRouter" )
      def receive = {
        case Caculate => {
          for (i <- 0 until nrOfMessage)
            workerRouter ! Work(i*nrOfElement, nrOfElement)
          }
        case Result(value) => {
          pi += value
          nrOfResults +=1
          if(nrOfResults == nrOfMessage){
            listener ! PiApproxomation(pi, (System.currentTimeMillis()-start).millis)
            context.stop(self)
          } 
        }                      
      } 
    }
    
    
    class Listener extends Actor{
      
      def receive = {
        case PiApproxomation(pi:Double, duration:Duration) => {
          println("
    	Pi approximation: 		%s
    	Calculation time: 	%s".format(pi, duration))
          context.system.shutdown()
        }
      }
    }
    



    流程图:





  • 相关阅读:
    事务
    约束条件(CONSTRAINTS)
    算术运算符
    数据查询、修改指令
    iview-admin使用webpack打包之后发布报Uncaught SyntaxError: Unexpected token <
    使用localhost可以访问,但使用本地ip+端口号无法访问
    datatables里面的search怎么去掉?
    删除操作之后的确定或取消弹出框?
    jquery实现上传图片本地预览效果
    怎么改变title属性的样式?
  • 原文地址:https://www.cnblogs.com/leeeee/p/7276107.html
Copyright © 2020-2023  润新知