Akka入门Scala版(Idea,SBT)ITeyeguojizaixian - 众发娱乐

Akka入门Scala版(Idea,SBT)ITeyeguojizaixian

2018-11-06 11:27:01 | 作者: 振锐 | 标签: 成果,运转,指令 | 浏览: 3681

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

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

下载SBT0(0.12)有必要这么版别由于SBT-IDEA这个插件需求这个版别;

1.设置SBT:

 留意:每一行内容需求空一行,不然编译不错

 

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)
 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                          
			
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表众发娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章