执行上下文访问

4
我有这个特性。
trait NonBlockingGoodness extends DataStore {
  import akka.dispatch.{ Future, ExecutionContext }
  import akka.util.duration._
  import akka.util.Timeout

  implicit val ec = ExecutionContext.fromExecutorService(yourExecutorServiceGoesHere)
  implicit lazy val timeout = Timeout(5 seconds)     
}

我希望您能够像这样在另一个trait中访问ExecutionContext
trait AsyncGoodness extends NonBlockingGoodness {
  import akka.dispatch.Future

  def doSomething = {
    Future { "Future is the bomb." }
  }

然而,我遇到了错误。
Could not find implicit value for parameter executor: akka.dispatch.ExecutionContext

更新: 我找到了如何在范围内获取ExecutionContext的方法。

trait AsyncGoodness extends NonBlockingGoodness {
  import akka.dispatch.ExecutionContext
  import akka.dispatch.Future

  def doSomething()(implicit executor: ExecutionContext) = {
    Future { "Future is the bomb." }
  }

然而,我有一个后续问题。由于在AsyncGoodness中可能会有多个使用ExecutionContext的方法,是否有一种方法可以在trait级别上传递它,而不是像上面每个方法都需要。


只是一句过去的话:你的名字NonBlockingGoodness意味着所有阻塞都是坏事。这是现在普遍的信仰,但有点天真:在某些情况下,非阻塞IO可能比阻塞IO更糟糕。其他问题,例如存在过多的并行性以及是否拥有(或没有)良好调整的线程池,甚至避免Amdahl定律的陷阱,都必须考虑到。这是一个案例历史记录:http://www.bigbeeconsultants.co.uk/blog/dispatch-http-critique - Rick-777
1
仅仅在上下文中使用非阻塞就足够好了吗?或者你是否考虑到这个名称仅仅意味着这个特性会做一些好事,并且恰好是以非阻塞的方式实现的?这是什么,Tumblr? - hoff2
2个回答

2

我知道你不想额外导入任何东西,但是这种方法对你应该有用。

trait NonBlockingGoodness {
  import scala.concurrent.{ Future, ExecutionContext }
  import scala.concurrent.util.duration._
  import akka.util.Timeout

  object Implicit {
     implicit val ec = ExecutionContext.Implicits.global
     implicit lazy val timeout = Timeout(5 seconds)
  }

}

trait AsyncGoodness extends NonBlockingGoodness {
  import scala.concurrent.Future
  import Implicit._
  def doSomething = {
    Future { "Future is the bomb." }
  }
}

Bob似乎正在使用Akka2.0,但是你的答案只适用于Scala2.10。 - Roland Kuhn
我知道我的导入语句与他使用的不匹配。但是我认为“object Implicit {}”和“import Implicit._”这个基本概念在Scala 2.9中是起作用的。 - cessationoftime
是的,这种技术适用于两个版本,我只是想指出细节上的偏差。 - Roland Kuhn

0
事实证明,我所需要做的就是显式地指定编译器使用ec返回类型。以下是可工作的代码。
trait NonBlockingGoodness extends DataStore {
  import akka.dispatch.{ Future, ExecutionContext }
  import akka.util.duration._
  import akka.util.Timeout

  implicit val ec: ExecutionContext = ExecutionContext.fromExecutorService(yourExecutorServiceGoesHere)
  implicit lazy val timeout = Timeout(5 seconds)     
}

trait AsyncGoodness extends NonBlockingGoodness {
  import akka.dispatch.Future

  def doSomething = {
    Future { "Future is the bomb." }
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接