scala actor執行緒模型可以這樣理解:所有actor共享乙個執行緒池,總的執行緒個數可以配置,也可以根據cpu個數決定;當乙個actor啟動之後,scala分配乙個執行緒給它使用,如果使用receive模型,這個執行緒就一直為該actor所有,如果使用react模型,scala執行完react方法後丟擲異常,則該執行緒就可以被其它actor使用。
下面看一些核心**。
def start(): actor =其中reaction實現runnable介面,scheduler基本相當於是乙個執行緒池,所以呼叫start方法之後會有乙個執行緒來為該actor服務。synchronized
this
}
使用receive模型。
def receive[r](f: partialfunction[any, r]): r =如果當前mailbox裡面沒有可以處理的訊息,呼叫suspendactor,該方法會呼叫wait;如果有訊息,這呼叫partialfunction進行處理。else
waitingfor = waitingfornone
issuspended =
false
} val result = f(received.get)
sessions = sessions.tail
result
使用react模型。
def react(f: partialfunction[any, unit]): nothing =再來看看接收訊息的處理**。else
throw
newsuspendactorexception
}
def send(msg: any, replyto: outputchannel[any]) =這樣,相信大家對scala actor就有了乙個基本的認識。synchronized
if(issuspended)
resumeactor()
else
// assert continuation != null
scheduler.execute(
newreaction(
this
, continuation, msg))
} else
Actor模型的本質
actor模型的本質已經被強調了無數遍 萬物皆actor。actor之間只有傳送訊息這一種通訊方式,例如,無論是管理員讓工作者幹活,還是工作者把成果交還給管理員,它們之間也要通過傳送訊息的方式來傳遞資訊。這麼做看似不如直接方法呼叫來的直接,但是由於大量的訊息可以同時執行。同樣,訊息讓actor之間解...
Actor併發模型入門
使用scala,基於akka的actor併發模型。importakka.actor.actor importakka.actor.props importakka.actor.actorsystem importakka.routing.roundrobinpool 定義乙個封閉的特質 sealed...
Actor模型和CSP模型的區別
引用至 akka erlang的actor模型與go語言的協程goroutine與通道channel代表的csp communicating sequential processes 模型有什麼區別呢?首先這兩者都是併發模型的解決方案,我們看看actor和channel這兩個方案的不同 actor模...