6

Play 被描述为一个“反应式”框架,对异步编程很有用。我想了解更多关于play的架构,主要是:

  • 它有事件循环吗?

  • 它有很多 akka 演员系统吗?它们是否由多个线程池支持?

  • 如果有,那么有多少线程池以及它们的目标是什么(路由、请求处理、承诺兑现、异常等)

  • 我们可以阻止哪个执行线程(我们可以在哪里进行一些昂贵的计算)?哪个是我们永远不应该阻塞的执行线程?

任何关于此的资源/wiki/建议都非常有帮助。谢谢

4

2 回答 2

7

注意:以下内容适用于 Play!2.1.x。为......而玩!2.0.4 见 nico_ekito 的回答。

下表总结了与客户的互动:

Play! 的架构

Play 的 HTTP 处理程序(建立在Netty之上)存在于它自己的执行上下文中。当它收到请求时,它会尝试根据 URL(使用应用程序的conf/routes文件)找到要调用的应用程序的入口点。此时,只有 HTTP 请求的 headers 被加载到内存中。

然后,调用入口点。它通常是一个动作,它加载剩余的主体(如果有的话)。这发生在不同的执行环境中,即 Play!“用户”执行上下文,定义为可以在应用程序conf/application.conf文件中配置的 Akka Actor 调度程序。

最后,在一个动作中,您可以执行异步调用(例如调用Web 服务)。所有这些异步调用都使用 Scala 的Future API,因此它们使用调用站点范围内可用的执行上下文。因此,您可以使用 Play!“用户”执行上下文(定义在 中play.api.libs.concurrent.Execution.defaultContext)。

总之,玩!对以下任务使用不同的执行上下文:

  • 接收请求(Netty HTTP 处理程序);
  • 调用动作(“用户”执行上下文)。

而且你可以自由地使用你想要的任何执行上下文来进行异步计算(包括 Play!“用户”执行上下文)。

这个想法是所有用户代码默认使用 Play!“用户”执行上下文。如果您阻止它,您将无法运行更多用户代码,但可以继续执行其他所有操作。

如果您正在进行扩展计算,我建议您使用专用的执行上下文。

于 2012-11-07T19:35:39.940 回答
1

看看 Akka 默认配置和Play 上的 Actor 列表!维基

于 2012-09-30T14:26:03.017 回答