2012-09-28 121 views
6

玩被描述为一个'反应性'框架,对异步编程有用。我想了解更多关于游戏的架构,主要有:玩线程体系结构

  • 它是否有事件循环?

  • 它是否有许多阿卡演员系统?他们是否支持多个线程池?

  • 如果是的话有多少线程池在那里,他们是什么目的(路由,请求处理,保证救赎,ANORM等)

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

对此的任何资源/ wiki /建议是非常有用的。谢谢

回答

7

注意:以下内容适用于Play! 2.1.x.为......而玩! 2.0.4请参阅nico_ekito的答案。

与客户的相互作用可以通过下面的图表来概括:

Play!’s architecture

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

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

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

综上所述,Play!为以下任务使用不同的执行上下文:

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

而且您可以随意使用您希望用于异步计算的任何执行上下文(包括Play!“用户”执行上下文)。

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

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

+0

谢谢@Julien。所以用户执行上下文(这是默认的)可以在'application.conf'中调整?什么是默认配置? –

+0

调度员的名字是“play”,你可以将其配置为任何[Akka dispatcher](http://doc.akka.io/docs/akka/2.1.0-RC1/scala/dispatchers.html) –