Scala 与Akka的演员进行长时间的阻塞任务

Scala 与Akka的演员进行长时间的阻塞任务,scala,akka,Scala,Akka,例如,我希望我的一个Akka演员执行长时间运行的阻塞任务,在很长的字符串中查找子字符串。我应该如何做到这一点,遵循演员的发展观,而不是阻止其他演员等 我正在考虑使用PinnedDispatcher在一个单独的线程中运行此参与者,但我不确定。您可以在将来包装调用您可以在将来包装调用您可以在将来包装任务,并使用管道模式将结果发送给其他参与者。另一个参与者将收到结果值或保存原因的akka.actor.Status.Failure。 如果您想回复发件人,则应该是: import akka.pattern

例如,我希望我的一个Akka演员执行长时间运行的阻塞任务,在很长的字符串中查找子字符串。我应该如何做到这一点,遵循演员的发展观,而不是阻止其他演员等


我正在考虑使用PinnedDispatcher在一个单独的线程中运行此参与者,但我不确定。

您可以在将来包装调用

您可以在将来包装调用

您可以在将来包装任务,并使用管道模式将结果发送给其他参与者。另一个参与者将收到结果值或保存原因的akka.actor.Status.Failure。 如果您想回复发件人,则应该是:

import akka.pattern.pipe

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

您可以在将来包装任务,并使用管道模式将结果发送给其他参与者。另一个参与者将收到结果值或保存原因的akka.actor.Status.Failure。 如果您想回复发件人,则应该是:

import akka.pattern.pipe

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

如果这个计算将在它自己的执行上下文上运行,这意味着不同的调度程序,并且在将来被包装,我认为你不能做更多的事情。如果这个计算将在它自己的执行上下文上运行,这意味着不同的调度程序,如果我想发送带有计算结果的消息,我可以在将来设置onComplete回调,对吗?你可以折叠消息的发送者,然后在将来完成时发送响应。但是,您必须小心,并确保在执行未来操作之前将发送方分配给本地val。然后你将回复发送回本地副本,而不是原始的senderI会给出一个代码示例,但我在医院等我的女朋友生孩子,我正在手机上做这件事。基本上,你应该在谷歌上搜索并阅读actorsThank,@bobbyr,我已经理解了这个想法。如果你只想将结果发送给发送者,请使用pipeTo。如果我想发送带有计算结果的消息,我可以在将来设置onComplete回调,对吗?你可以把邮件的发件人折叠起来,然后在将来完成时发送回复。但是,您必须小心,并确保在执行未来操作之前将发送方分配给本地val。然后你将回复发送回本地副本,而不是原始的senderI会给出一个代码示例,但我在医院等我的女朋友生孩子,我正在手机上做这件事。基本上你应该在谷歌上搜索并阅读actorsThank,@bobbyr,我已经理解了这个想法。如果你只是想将结果发送给发送者,请使用pipeTo。