使用scala的actor模型實現併發的例子

2021-07-15 20:44:40 字數 1755 閱讀 1670

/**

* created by lengmengwuxie on 2016/7/29.

*/import scala.actors._

import scala.actors.actor._

//設計方式:

// 1,任何模擬物件在所有其他模擬物件完成對時間n的處理之前,都不應該處理時間n+1的事件

// 2,假設要實現所有模擬物件同步執行,使用乙個「時鐘」actor來跟蹤當前的時間

//在選定的時間去傳送ping訊息到所有actor 檢查是否當前時間點的事件都已經被完成

case class ping(time: int)

//模擬物件確認已經處理完畢 返回pong事件

case class pong(time: int, from: actor)

//3,為了模擬物件能夠切確知道自己已經完成了當前時間點的工作,而不是還需要等待與其他actor之間的

//訊息反饋,需要增加兩個限制:

// a,模擬物件從不直接相互傳送訊息,而是相互安排事件日程;

// b,從不向當前時間點提交時間,而是向未來至少比當前多一點的時間提交;

//因此我們需要乙個工作項的日程表,這個日程表也可以在「時鐘」actor上,時鐘actor先為所有模擬物件

//傳送當前時間點所有的工作項的請求之後,才傳送ping訊息。

//工作項訊息

case class workitem(time: int, msg: any, target: actor)

//安排新工作的訊息

case class afterdelay(delay: int, msg: any, target: actor)

//用於要求模型啟動和停止的訊息

case object start

case object stop

//時鐘actor

class clock extends actor

def act(): unit =

} //時間前進

def advance(): unit =

currenttime += 1

println("advacting to time" + currenttime)

processcurrentevents()

for (sim <- allsimulants) //向所有工作中的模擬物件傳送ping

sim ! ping(currenttime)

busysimulants = set.empty ++ allsimulants

} //處理所有在日程表裡時間為currenttime的事件

private def processcurrentevents():unit =

} //react事件處理

def reacttoonemessage(): unit =

} def insert(ag: list[workitem], item: workitem): list[workitem] =

}//不同的被模擬物件之間有的共同行為,將其定義為特質

//simulant是能夠接受模擬訊息stop和ping並於他們合作的任何actor

trait simulant extends actor

def act(): unit =

}} //模擬物件在建立時便啟動執行,安全且方便,在接受到時鐘訊息之前不會做任何事

start()

}

scala的actor的學習一

閱讀過一些actor的例子,在學習scala的actor 一,開發乙個scala檔案,另存actor1.scala檔案到指定的資料夾下,d temp import scala.actors.actor.匯入actor中的方法 package com.study.scala act hello sca...

Actor模型的本質

actor模型的本質已經被強調了無數遍 萬物皆actor。actor之間只有傳送訊息這一種通訊方式,例如,無論是管理員讓工作者幹活,還是工作者把成果交還給管理員,它們之間也要通過傳送訊息的方式來傳遞資訊。這麼做看似不如直接方法呼叫來的直接,但是由於大量的訊息可以同時執行。同樣,訊息讓actor之間解...

Actor模型原理

scala actor執行緒模型可以這樣理解 所有actor共享乙個執行緒池,總的執行緒個數可以配置,也可以根據cpu個數決定 當乙個actor啟動之後,scala分配乙個執行緒給它使用,如果使用receive模型,這個執行緒就一直為該actor所有,如果使用react模型,scala執行完reac...