2014-08-30 40 views
1

我想讓我的一個Akka演員執行長時間運行的阻塞任務(例如,在一個很長的字符串中查找一個子串)。我應該如何做這個演員的哲學(不阻止其他演員等)?Akka的演員長時間阻塞任務

我正在考慮在與PinnedDispatcher分開的線程中運行此演員,但我不確定。

+0

如果這個計算將在自己的執行上下文中運行,這意味着不同的調度員,幷包裹在'future'我認爲你不能做任何事情更多。 – goral 2014-08-30 17:01:28

回答

2

你可以包裝該呼叫並在未來

+0

如果我想發送帶有計算結果的消息,我可以在將來設置'onComplete'回調,對吧? – 2014-08-30 17:10:24

+0

您可以摺疊郵件的發件人,然後在未來完成時發送回覆。但是,在執行未來之前,您必須小心並確保將發件人分配給本地val。然後,您將回復發送回本地副本而非原始發件人 – bobbyr 2014-08-30 17:23:54

+2

我會舉一個代碼示例,但我正在醫院等待我的女朋友分娩,而我正在通過手機進行此操作。基本上你應該谷歌和閱讀關於在演員摺疊可變狀態的風險 – bobbyr 2014-08-30 17:30:32

5

你可以用任務在未來使用pipe模式將結果發送到其他演員。另一個演員將收到結果值或持有原因的akka.actor.Status.Failure
如果你想給發件人迴應這將是:

import akka.pattern.pipe 

def receive: Receive = { 
    case msg => 
    val future: Future[String] = Future(longRunningBlockingTask(msg)) 
    future pipeTo sender 
}