玩2!框架多线程问题

时间:2014-06-25 04:46:05

标签: multithreading playframework-2.0

我有一个标准游戏2!通过JSON与前端通信的应用程序。 所有请求都路由到控制器。现在控制器导入了一些重型计算类。

因此,如果用户请求计算,控制器方法可能需要5秒才能从实际计算类中获取结果,因为计算是迭代的并且需要时间。

这是不是意味着服务器在这5秒内被阻止了?它无法为任何其他用户提供服务?是否有20人同时使用此计算工具,由于队列较长,其他人甚至可能难以加载由同一服务器提供的主页... 我是否正确的思考方式和可能的解决方案是什么?

2 个答案:

答案 0 :(得分:1)

您的假设是正确的。 Play 2使用一些线程池,每个线程池分配给特定的东西。见here

就像你说的那样,使用默认配置并假设你同步调用你的计算类,如果超过24人同时访问你的网站,你的Play 2应用程序将开始阻止。

我特别提到了24个人,因为Play default thread pool configuration被设置为每个核心1个线程,最多24个线程。 See here了解更多选项。因此,如果您阻止所有24个线程,您将开始在站点响应方面遇到问题。

有一些解决方案:

  • 增加默认线程池大小(如果您对负载有什么了解的话)See here 了解更多关于
  • 的信息
  • 为您的繁重计算类专门创建一个单独的线程池/执行上下文(请参阅文档"使用其他线程池"),并在提供执行上下文的promise / future中调用它。这样,默认线程池不会受到阻塞调用的负担。同样,您必须根据您的要求调整该池。
  • 将您的繁重计算功能实现为Akka Actors。 See here(如果你有时间,可能是最好的解决方案)

答案 1 :(得分:1)

是和否。如果你有需要很长时间才能完成的动作,那么异步处理它们可能是一个好主意(否则你的权利,它们会阻止)。

查看documentation。他们解释了你应该做什么(使用promise并在必要时创建新的线程来处理计算),以使你的Action无阻塞。