1. 程式人生 > >scala中Actor特性,物件之間通訊使用

scala中Actor特性,物件之間通訊使用

Actor

為什麼需要Actor?

Actor的本質即萬物皆Actor, Actor之間只有傳送訊息這一種通訊方式。例如,無論是管理員讓工作者幹活,還是工作者把成果交還給管理員,它們之間也要通過傳送訊息的方式來傳遞資訊。這麼做看似不如直接方法呼叫來的直接,但是由於大量的訊息可以同時執行。同樣,訊息讓Actor之間解耦,訊息發出之後執行成功還是失敗,需要耗費多少時間,只要沒有訊息傳遞回來,這一切都和傳送方無關。Actor模型的訊息傳遞形式簡化了並行程式的開發,使開發人員無需在共享記憶體(確切地說,其實是共享“寫”)環境中與“鎖”、“互斥體”等常用基礎元素打交道。

       Actor提供了併發程式中與傳統的基於鎖的結構不同的另一種選擇。通過儘可能避免鎖和共享狀態,Actor使得我們能夠更容易地設計出正確,沒有死鎖或爭用狀況的程式。

Tip1:

Actor的本質即萬物皆Actor, Actor之間只有傳送訊息這一種通訊方式。

Tip2:

避免使用同步呼叫(!?),它們會阻塞,很有可能引發死鎖。

Tip3:

不同的actor可以通過React共享執行緒。

Tip4:

不同的actor之間不應該共享狀態,不要直接呼叫actor的方法,而是通過訊息通訊。

1 建立和啟動Actor

Tip1:

Actor的訊息佇列會序列化訊息。Actor執行在單個執行緒中,它會先接受一條訊息,然後接收下一條。不用在Actor程式碼中擔心爭用狀況。

Tip2:

Actor的act方法在start方法被呼叫時開始執行。如果act方法返回或是由於異常被終止或是actor呼叫exit方法,都會導致actor終止執行。

Tip3:

如果在receive方法被呼叫時並沒有訊息,該呼叫會阻塞,直到有訊息到達。如果發來的訊息無法匹配,同樣會阻塞,等待下一個訊息。

Tip4:

接受訊息除了receive和react兩種方式還receiveWithin(5000),reactWithin(5000),其中的引數表示在5秒內沒收到資訊將返回一個Actor.TIMEOUT物件。


結果:

2 與其他Actor通訊

Tip1:

Actor可以構造成帶有指向一個或更多actor的引用。

Tip2:

Actor可以接受帶有指向另一個actor的引用的訊息,在請求中提供一個actor引用非常常見。

Tip3:

Actor可以返回訊息給傳送方。Receive會把sender欄位設為當前訊息的傳送方。


3 共享執行緒的Actor

Tip1:

儘可能的使用react,使用react的actor可以共享執行緒。只要訊息處理器的工作是執行某個任務,然後退出,你就可以使用react。

Tip2:

每次對react的呼叫都會丟擲異常,進行清棧。

 

4 同步訊息

Tip1:

actor可以傳送一個訊息並等待回覆,用!?操作符即可。

Tip2:

同步訊息容易引發死鎖,最好避免使用。


5 FUTURE

Tip1:

!!操作符傳送的訊息會返回一個物件(future),該物件可以稍後處理,也可以傳送給其他Actor。

Tip2:

如果立即就想從future接受返回的結果進行處理,就相當於是同步訊息(!?)。


6 將多個Actor連結起來

Tip1:

如果你將兩個Actor連結在一起,雙方都會在另一個終止執行的時候得到通知。

Eg. 監管actor在數個工作actor中分發工作任務,當某個actor掛掉的時候,監管actor應該知道,重新指派工作或是重啟該actor。相應的,如果監管actor掛掉,actor也應該知道,以便停止工作。

Tip2:

當一個actor終止的時候,仍保留其內部狀態和郵箱(訊息佇列)。如果要得到這些訊息,可以呼叫該終止actor的restart方法。另外你還可以重新建立連結,因為一個actor終止時其連結會被移除。

Tip3:

當前actor連線到的actor中有一個以非正常(normal)原因退出。當前actor也會終止,退出原因和連結到的那個actor退出原因相同。如果你設定trapExit為true。修改後actor會接收到一個Exit型別的訊息,該訊息包含了退出原因和正在退出的actor。

 

執行結果: