【问题标题】:Play 2 thread pools : default pool VS Akka Pool with Java玩 2 个线程池:默认池 VS Akka 池与 Java
【发布时间】:2013-05-13 06:44:19
【问题描述】:

根据文档,使用actor的更简单方法是:

承诺 promiseOfInt = Akka.future(new Callable() { 公共整数调用(){ 返回 ... ; } } );

但文档还说,对于 Java API,它将始终使用相同的线程池(播放默认线程池)。

文档说还有一个 Akka 池供演员使用。 如何将此actor任务发送到Akka线程池,而不是阻止常见的用户操作? 所以我可以调整 Akka 池并保持默认池较小。

谢谢, 逻辑

【问题讨论】:

  • 你检查Play thread pools doc了吗?
  • 是的,我做到了,这就是我问这个问题的原因。我觉得它模棱两可,演员有一个 Akka 池,但文档还说,使用 Java API,它将始终使用相同的线程池(播放默认线程池)。
  • 可以创建自定义ExecutionContext(即自定义Actor池),直接调用Akka API使用:doc.akka.io/japi/akka/2.1.2/akka/dispatch/…, scala.concurrent.ExecutionContext) 和doc.akka.io/docs/akka/2.1.2/java/futures.html
  • 谢谢!我会检查的:)
  • 但我更喜欢使用提供的 Akka 池而不是创建自己的执行上下文...

标签: playframework playframework-2.0 akka


【解决方案1】:

Java Akka 插件 (play.libs.Akka) 转发到 Scala 插件 (play.api.libs.Akka),后者又会根据应用程序的配置启动一个新的 Actor 系统。 (这就是插件所做的一切。)

因此,您可以使用基于 akka 配置键的普通 application.conf 文件配置 ActorSystem 及其所有调度程序(调度程序也是 ExecutionContext)。这些调度程序是文档所指的线程池。

导入play.api.libs.concurrent.Execution.default 时使用默认线程池。这是一个仅限 Scala 的 API。在 Java 中,只要你接触到 futures 和 promises,这个 ExecutionContext 就会自动使用。这个线程池实际上是基于 Play 内部的 Actor 系统,通过 play 配置键配置的。

总而言之,当通过 Akka 插件的 ActorSystem 创建时,所有的 Actor 都会自动使用 Akka 线程池(在 Actor 内部,您可以使用 context.dispatcher 引用它)。

外部参与者,您将使用 Play 的默认/内部线程池。

【讨论】:

    猜你喜欢
    • 2011-10-14
    • 2022-08-20
    • 2012-09-03
    • 2013-04-19
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2018-12-01
    • 2023-03-28
    相关资源
    最近更新 更多