2011-06-11 44 views

回答

9

eventloop作用與loopreact相似。 loopeventloop之間的區別在於,loop實際上並沒有遞歸地調用主體(以防止基於線程的actor的堆棧溢出),而是安排從郵箱處理(反應/接收)下一條消息,並完成執行當前處理程序拋出異常,清除調用堆棧。

eventloop遞歸處理使用react消息 - 在react情況下,它是安全的(和堆棧沒有得到溢流),因爲react身體(!但不receive)總是異常結束,在大多數情況下,並計劃下一個循環,以保證所有參與者能夠公平地訪問線程池。因此,eventloop只能用於事件驅動的參與者。

import scala.actors._ 
import Actor._ 

class EventLoop extends Actor { 
    def act = eventloop{ 
     case msg => println("Received " + msg) 
    } 
} 
3

也許this thread可以給一些細節:

一對演員很重要的動機是他們讓你 避免控制反轉意味着至多有一個線程 在一個時間一個演員內部執行,並用戶通過編寫一個在控制流中顯式地等待消息等待 消息的直線程序來選擇何時發生這種情況。

在這個模型中,人們通常希望避免將回調函數傳遞給異步調用它們的其他線程;相反,其他線程只能通過向其發送消息來與演員互動。 如果回調類似的行爲被通緝那麼下面的模式實現它 在一個線程安全的方式

def eventloop() { 
    react { 
     case Event1 => 
     // handle Event1 
     eventloop() 
     ... 
     case Eventn => 
     // handle Eventn 
     eventloop() 
    } } 

這種模式在Actor.eventloop作爲一個抽象的操作:

import scala.actors.Actor._ 

    eventloop { 
    case Event1 => 
     // handle Event1 
    case Eventn => 
     // handle Eventn 
    } 

請注意,不需要對某些封閉函數進行尾調用任何更多。


話雖這麼說,從2008年考慮螺紋日期和Scala Actor API guide沒有提到eventloop一次,也許這不使用頻繁。
Vasil Remeniuk熟練的詳細信息eventloophis answer (+1)中的用法,並在問題「Client-Server example with Scala actors」中給出具體示例。

相關問題