玩线程架构

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

>它有事件循环吗?
>它有很多akka演员系统吗?他们是否有许多线程池支持?
>如果是这样,有多少个线程池,它们的目标是什么(路由,请求处理,承诺兑换,anorm等)
>哪个是我们可以阻止的执行线程(我们可以在哪里进行一些昂贵的计算)?哪个是我们永远不应该阻止的执行线程?

任何资源/维基/建议都非常有用.谢谢

注意:以下内容适用于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! “user”执行上下文(在play.api.libs.concurrent.Execution.defaultContext中定义).

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

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

您可以自由地使用您想要的任何执行上下文进行异步计算(包括Play!“user”执行上下文).

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

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

相关文章
相关标签/搜索