2014-08-30 34 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 
}