`
criss
  • 浏览: 24255 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Akka入门Scala版(Idea,SBT)

阅读更多

Akka

异步处理框架,自己Google

 

前期准备:

idea12(http://www.jetbrains.com/idea/)

在插件库中下载SBT,SCALA插件(Intellij Idea->Preferences...->Plugins)

下载SBT0(0.12)必须这么版本因为SBT-IDEA这个插件需要这个版本;

1.设置SBT:

 设置IDE-SETING中的SBT-LAUNCHER的路径即可

 

实例介绍:

计算圆周率Pi,算法如下:

算法实现:假设N为100000,我们可以把它分成多段比如10000一个处理线程,多个线程并发处理,最后把这十个线程的结果加起来就是Pi的值。在分布式的环境中,我们可以把这些线程放在不同机器上,同时并发处理,这样会获得更高的性能。在Akka里面要实现上述逻辑是相当简单的。下面我们来详细看看怎么在Idea环境中编写上诉代码。

 

项目搭建

1.新建Scala项目,设置项目路径和ScalaHome的路径

3.在项目根目录下创建buid.sbt文件,内容如下:

name := "hello"

version := "1.0"

scalaVersion := "2.9.2"

resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/"

libraryDependencies += "com.typesafe.akka" % "akka-actor" % "2.0.2"

 注意:每一行内容需要空一行,否则编译不错

 

2.增加插件,sbt-idea.

项目目录下新建文件夹:project,在project目录下新建文件plugins.sbt,内容如下:

addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.2.0")

3.点开左下角的SBT控制台,点击绿色的运行按钮,请耐心等待,SBT将会下载一堆有的没得,不知道什么原因在我的环境在居然搞了快2个小时

4.运行gen-idea命令,sbt将会生成IDEA的项目文件,重新载入项目,至此SCALA+SBT的环境就搭建好了,可以开始编码了。我在运行时还碰到一个小问题,就是hello-build模块的编译输出路径和测试输出路径一样,导致scala无法编译通过,只需要修改Scala的编译测试输出路径即可。

 

回到刚才的例子:

我将会用两个Actor来完成这个工作。Worker(工作线程,完成分段计算),Master(主线程,完成分段线程的划分,调度,结果合并,打印),下面来看看代码:

package main.scala

import akka.actor.{ActorSystem, Props, Actor}
import akka.routing.RoundRobinRouter

/**
 * Created with IntelliJ IDEA.
 * User: criss
 * Date: 13-2-21
 * Time: 上午1:37
 * To change this template use File | Settings | File Templates.
 */
object Pi extends App {
    //Actor传递消息特质,所有的消息都实现这个特质
    sealed trait PieMessage
    //工作线程的运行指令,start:分段开始的值,nrOfElements:本段的数目
    case class Work(start: Int, nrOfElements: Int) extends PieMessage
    //工作线程结果返回指令
    case class Result(value:Double) extends PieMessage
    //主线程运行指令
    case object Calculate extends PieMessage

    caculate(10000,10,10000)

    class Worker extends Actor {

        def caculate(start:Int,nf:Int) = {
            var acc:Double = 0.0
            //计算start到start+nf的数值,详见上面公式
            for (i <- start until start+nf)
            {
                acc +=  4.0 * (1 - (i % 2) * 2) / (2 * i + 1)
            }

            acc
        }

        def receive = {
            //处理运行指令
            case Work(start, nfOfElement) =>
            //返回给主线程结果
            sender !  Result(caculate(start,nfOfElement))
        }
    }
    //nrOfMesseage 工作线程数
    //nfWorks工作线程调度池的大小
    //nrOfElements每个工作线程计算的数值大小
    class Master(nrOfMesseage:Int,nfWorks:Int,nrOfElements:Int) extends Actor
    {
        //最后的结果
        var pi:Double = _
        //计数,计算已经运行完多少个Worker
        var nrOfResults:Int = 0
        //你可以理解成一个线程池,用于调度Worker
        val workerRouter = context.actorOf(
            Props[Worker].withRouter(RoundRobinRouter(nfWorks)),name="workers"
        )
        //存储开始时间
        var start:Long  = _
        def receive = {
            case Calculate =>
                start = System.currentTimeMillis;
                for (i <- 0 until nrOfMesseage)
                    workerRouter ! Work(i*nrOfElements,nrOfElements)
            case Result(value) =>
                //当有一个结果返回时,合并结果
                pi += value
                //计算当前返回的结果总数
                nrOfResults += 1
                //当全部结果返回时,打印结果退出
                if(nrOfResults == nrOfMesseage)
                {
                    println(pi)
                    println("耗时:"+(System.currentTimeMillis()-start))
                    context.system.shutdown()
                }

        }
    }

    def caculate(nrOfMesseage:Int,nfWorks:Int,nrOfElements:Int)
    {
       //初始化ActorSystem
        val system = ActorSystem("PiSystem")
       //初始化主线程
        val master = system.actorOf(Props(new Master(nrOfMesseage
        ,nfWorks,nrOfElements)),name="master")
        //发送计算指令
        master ! Calculate
    }



}

 

 

 

 

  • 大小: 25 KB
  • 大小: 66.5 KB
  • 大小: 157.3 KB
分享到:
评论
1 楼 itstarting 2014-07-10  
谢谢分享。

需要指出的是,代码中有两个小错误:

1. 在build.sbt中,需要导入akka-routing
libraryDependencies += "com.typesafe.akka" %% "akka-routing" % "2.0.2"

2. 需要把RoundRobinRouter改为RoundRobinPool,因为此类已被重新命名

相关推荐

    IntelliJ IDEA使用SBT构建一个AKKA Scala程序

    本教程将详细介绍如何在IntelliJ IDEA中使用SBT来构建一个基于AKKA框架的Scala程序。 首先,你需要确保已经安装了IntelliJ IDEA和Scala插件。如果尚未安装,可以从官方网站下载并按照提示进行安装。同时,确保你的...

    Akka Scala 学习高清原版pdf

    Akka是一个用Scala和Java编写的库,用于构建并发、分布式以及容错的事件驱动应用。Akka框架借鉴了Erlang的并发模型,但它是建立在JVM之上,并且提供了丰富的抽象和工具,能够简化开发工作。 标题“Akka Scala 学习...

    akka框架,应用于scala

    至于"akka-quickstart-scala"这个文件,很可能是Akka的Scala快速入门示例,其中可能包含了如何创建和交互Actor、配置Actor系统、处理消息以及实现简单的并发和分布式应用的代码示例。通过学习和实践这些示例,开发者...

    scala PLAY 框架 sbt仓库

    在使用Scala Play框架和sbt的过程中,还有几个关键知识点: - **路由系统**:Play框架的路由文件定义了URL模式如何映射到控制器方法,这是实现RESTful API的关键部分。 - **模板引擎**:Play支持Erb-like的模板语言...

    基于akka与scala实现一个简单rpc框架【100010261】

    详情介绍:https://www.yuque.com/sxbn/ks/100010261 基于akka与scala实现一个简单rpc框架 RPC,即 Remote Procedure Call(远程过程调用)。

    Akka入门与实践

    mDialog 是一家使用 Scala/Akka 的公司, 为主流出版商提供视频广告插入软件。这家公司最终被 Google 收购。他同时还是一名很 有影响力的“技术控”,将 Akka 引入加拿大一家主要的电信公司,帮助该公司为客户提 供...

    akka集群操作入门(scala版本).rar

    附件里是我写的利用scala语言对akka集群操作的入门例子,包含了akka cluster 节点启动、节点注册、节点剔除、节点通信等功能,亲测可用。附件里共有两个文件,一个为scala编写的操作源代码,一个为相关的资源文件。

    用Scala写的akka actor简单demo

    标题中的“用Scala写的akka actor简单demo”指的是一个使用Scala编程语言编写的Akka Actor系统的基本示例。Akka是轻量级、基于actor模型的框架,它用于构建高度并发、分布式和容错的应用程序。Scala是多范式编程语言...

    akka学习入门实践

    ### Akka 学习入门实践知识点详解 #### 一、Akka 概述 - **定义**:Akka 是一个用于构建高度并发、分布式、容错性应用的工具包,适用于 Java 和 Scala 开发者。它基于 Actor 模型,支持响应式编程范式。 - **目标**...

    scala akka

    Akka正是用Scala编写的,并且充分展示了Scala在并发编程方面的优势。 #### 2. Akka的核心概念:Actor模型 - **Actor模型**:在Akka中,Actor是最基本的并发单元。每个Actor都独立运行并且通过消息传递与其他Actor...

    akka scala分布式计算

    akka scala 实现求连续平方和,分布式计算,快速理解分布式计算原理!

    akka入门实践.zip

    Akka是用于在JVM上构建高并发、分布式和容错事件驱动应用程序的工具包和运行时环境... Akka可以与Java和Scala一起使用。Actor是Akka的执行单位。 Actor模型是一种抽象,可以更容易地编写正确的并发,并行和分布式系统。

    scala idea 配置插件

    1. 打开IntelliJ IDEA:启动IDE,如果你还没有安装,可以从官方网站下载最新版本的IntelliJ IDEA社区版或Ultimate版,两者都支持Scala开发。 2. 安装插件:启动IDE后,点击顶部菜单栏的“File” &gt; “Settings”...

    akka-chat:使用 Akka 和 Scala 的简单聊天服务器

    阿卡聊天使用 Akka 和 Scala 的简单聊天服务器。1. 第一个版本演员 ChatServer:加入和离开聊天组,向所有当前聊天成员广播传入消息演员 ChatClient:加入聊天组,广播第一条介绍信息ChatApp:首先运行具有三个 ...

    Akka scala

    ### Akka Scala 知识点概述 #### 一、引言 **Akka Scala** 是一个基于Actor模型的工具包,适用于构建高度并发、分布式且容错的应用程序。Akka Scala 不仅支持Scala语言,还提供了对Java的支持,使得开发者能够利用...

    Akka Scala Documentation Release 2.4

    《Akka Scala文档2.4版详解》 Akka是一个高度可扩展的并行和分布式计算框架,专为Java和Scala设计。它基于Actor模型,提供了强大的并发处理能力,能够帮助开发者构建高度可靠且高性能的应用程序。在Akka Scala ...

    Akka Actor 2.5.13的jar包

    Akka是JAVA虚拟机JVM平台上构建高并发、分布式和容错应用的工具包和...Akka用Scala语言写成,同时提供了Scala和JAVA的开发接口。 Akka处理并发的方法基于Actor模型。在Akka里,Actor之间通信的唯一机制就是消息传递。

    akka-serial:用于Akka和Scala的React性串行通信库

    Akka-Serial是一个专门为Akka和Scala设计的反应式串行通信库,它提供了一种高效、非阻塞的方式来处理串行端口通信。Akka是基于actor模型的并发框架,而Scala则是一种多范式的编程语言,两者结合使得Akka-Serial能够...

    响应式架构 消息模式Actor实现与Scala.Akka应用集成

    Akka框架就是用Scala编写的,因此,使用Scala来编写Akka应用程序可以充分利用语言的强大特性和表达能力,如类型安全、模式匹配和高阶函数等。 在"响应式架构 消息模式Actor实现与Scala.Akka应用集成"这个主题中,...

    Reactive.Programming.with.Scala.and.Akka.1783984341.epub

    Harness reactive programming to build scalable and fault-tolerant distributed systems using Scala and Akka About This Book Use the concepts of reactive programming to build distributed systems ...

Global site tag (gtag.js) - Google Analytics