scala學習八:scala的actor

scala學習八:scala的actor

標籤(空格分隔): scala


[Toc]

一,actor的創建和使用

001.PNG-60.9kB

import scala.actors._
//Actor是一個抽象類
class HiActor extends Actor{
    def act():Unit ={
        //處理消息
        while(true){
            receive{
                case "hi" => println("hi actor")
                case "hello" => println("hello actor")
            }
        }
    }
}

object HiActor{
    def main(args: Array[String]){
        val actor1=new HiActor
        actor1.start()
        //! 方法名稱
        actor1 !"hi"
    }
}

二,Actor的消息機制

001.PNG-29.4kB


import scala.actors._

case class MyMessage(inputdata:Int,outputChannel:OutputChannel[Int])

class MyComputer extends Actor{
    def act():Unit ={
        //處理消息
        while(true){
            receive{
                case MyMessage(inputdata,outputChannel) =>{
                    val ret=inputdata*10
                    outputChannel !ret
                }
            }
        }
    }
}

object MyComputer{
    def main(args: Array[String]){
        val computor=new MyComputer
        computor.start()

        val channel=new Channel[Int]()
        MyMessage msg=new MyMessage(10,channel)

        computer ! msg

        channel.receive{
            case 110 =>println("the result is correct!")
        }

    }
}

三,同步消息和Future

同步消息

import scala.actors._
//Actor是一個抽象類
//處理同步消息的時候,處理方會返回一個結果給發送發
//同步消息會阻塞當前線程的執行,知道收到返回的結果
class HiActor extends Actor{
    def act():Unit ={
        //處理消息
        while(true){
            receive{
                case "hi" => {
                    println("hi actor")
                    reply("success")
                }
                case "hello" => println("hello actor")
            }
        }
    }
}

object HiActor{
    def main(args: Array[String]){
        val actor1=new HiActor
        actor1.start()
        //! 方法名稱
        val ret=actor1 !?"hi"
        ret match{
            case "success" =>{
                println("success")
            }
        }
    }
}

001.PNG-20.4kB

四,Actor使用最佳實踐

1,避免使用公用狀態:儘量不要使用對象以外的的數據
2,不要調用actor方法
3,保持每個actor的簡單:actor儘量只做一件事,保持程序的簡潔和高效
4,將上下文數據包含在消息中
5,最小化給發送方回覆:減小網絡開銷
6,最小化阻塞調用
7,儘量使用react
8,建立失敗區

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章