2

我无法按照此处的说明创建 Future 。它说您可以Future使用以下代码直接创建一个:

import akka.dispatch.Await
import akka.dispatch.Future
import akka.util.duration._

val future  = Future {
  "Hello" + "World"
}
val result = Await.result(future, 1 second)

使用完全相同的代码,我收到一条错误消息,说:error: could not find implicit value for parameter executor: akka.dispatch.ExecutionContext. 我能找到的ExecutionContext只是,你可以用它“做事”。在文档中,我发现的唯一一行是:

implicit val ec = ExecutionContect.fromExecutionService(yourExecutionServiceGoesHere)

但这对我没有用。有人对我有什么建议吗?如何在Future不询问的情况下创建一个新的Actor

4

2 回答 2

7

如果你有,ActorSystem那么它将有一个ExecutionContext可以在这里使用的。必须是implicit,除非您将其显式传递给Future.apply方法。

出于演示的目的,如果您只是想看看它在 REPL 中是如何工作的:

implicit val system = ActorSystem("MySystem").dispatcher

ActorSystem => ExecutionContext(对象上还有一个隐式转换ExecutionContext。)

要创建模块化代码,而不是在使用点之前创建上下文,请考虑将上下文作为特征的抽象成员:

trait MyFutures {
  implicit val context: ExecutionContext

  def helloFuture: Future[String] = Future { "hello" + "world" }
}
于 2013-01-11T10:26:28.623 回答
3

您的代码无法编译,因为您正在编写非法的 Scala 代码:签名Future.apply明确说明了这一点。我假设您了解您正在调用特征 Future 的伴随对象的 apply 方法,如下所示:

object Future extends java.lang.Object with scala.ScalaObject {
  def apply[T](body : => T)(implicit executor : akka.dispatch.ExecutionContext) : akka.dispatch.Future[T] = { /* compiled code */ }
}

ExecutionContext由于调用时没有隐式可用Future.apply,因此会出现编译错误。如果您只提供一个参数,这与调用接收两个参数的方法相同。

can如何创建的问题ExecutionContext是不同的,您可以在Akka Documentation中找到答案:

为了执行回调和操作,Futures 需要一个叫做 ExecutionContext 的东西,它与 java.util.concurrent.Executor 非常相似。如果你有一个 ActorSystem 在范围内,它将使用它的默认调度程序作为 ExecutionContext,或者你可以使用 ExecutionContext 伴随对象提供的工厂方法来包装 Executors 和 ExecutorServices,甚至创建你自己的。

于 2013-01-11T10:39:45.143 回答