Play被描述为“反应式”框架,对异步编程非常有用。我想更多地了解游戏的架构,主要是:
是否有事件循环?
它有很多akka演员系统吗?他们是否有许多线程池支持?
如果有,有多少个线程池,它们的目标是什么(路由,请求处理,承诺兑换,anorm等)
我们 ok 要阻止哪个执行线程(我们可以在哪里进行一些昂贵的计算)?哪个是我们永远不应该阻止的执行线程?
任何关于此的资源/维基/建议都非常有用。谢谢
答案 0 :(得分:7)
注意:以下内容适用于Play! 2.1.x.为......而玩! 2.0.4请参阅nico_ekito的回答。
与客户的互动可以通过以下图表进行总结:
Play的HTTP处理程序(构建在Netty之上)存在于自己的执行上下文中。当它收到请求时,它会尝试根据URL(使用应用程序的conf/routes
文件)查找应用程序的入口点。此时,只有HTTP请求的标头被加载到内存中。
然后,调用入口点。它通常是action,它会加载剩余的身体(如果有的话)。这发生在不同的执行环境中,Play! “user”执行上下文,定义为可以在应用程序的conf/application.conf
文件中配置的Akka actor调度程序。
最后,在操作中,您可以执行异步调用(例如,调用Web Service)。所有这些异步调用都使用Scala的Future API,因此它们使用调用站点范围内可用的执行上下文。所以你可以使用Play! “用户”执行上下文(在play.api.libs.concurrent.Execution.defaultContext
中定义)。
总之,玩!为以下任务使用不同的执行上下文:
您可以自由地使用您想要的异步计算执行上下文(包括Play!“user”执行上下文)。
这个想法是所有用户代码默认使用Play! “用户”执行上下文。如果您阻止它,您将无法运行更多用户代码,但可以继续执行其他所有操作。
如果您正在进行广泛的计算,我建议您使用专用的执行上下文。
答案 1 :(得分:1)
查看Akka默认配置和the Play! wiki上的演员列表。