我正在使用play框架开发一个执行密集cpu计算的应用程序。这些计算由40个必须并行运行的部分组成。现在我为每个计算部分做了一个Akka演员,当要求计算时,会启动40个新演员。我的问题是在应用程序前面我正在运行一个轮询服务来检查计算是否已经结束,并且由于执行了这么多线程,cpu得到100%和轮询服务,当然还有整个导航,持续20秒,这是一个微不足道的要求,在正常情况下它持续不到1秒。
我在一个AWS小实例中运行它,只有一个核心。这是问题的一部分,但我需要确保当应用程序在生产中并且流量更大时,"后端"计算不会影响前方体验。
使用akka的常规方法是限制调度员" size"有更少的线程,然后有免费的CPU来处理前端请求,但我需要至少40个并行处理元素。我尝试用以下方法降低这些计算线程的优先级:
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
但我认为没有影响表现。我的主要问题是,有什么方法可以逻辑地对这些执行进行并列化,但不能创建这么多线程?
答案 0 :(得分:0)
我的意见:
似乎没有简单的方法来解决并行问题,因此整个想法是将前端服务与后向计算分开。
首先,WebSocket。在后端服务器上运行WebSocket服务,并从前端连接到该WebSocket。因此前端不会轮询服务器,但后台服务器会在计算结束时将结果推送到前面。
其次,使用现代JavaScript框架(如AngularJS)在另一个实例上运行前端服务,甚至主要在客户端浏览器上运行。
因此慢回计算不会再影响前端的性能,前端可以在完成时获得结果(通过WebSocket与后端通信)。