这个问题是关于Play框架的,尽管概念是通用的。
引用自:
https://www.playframework.com/documentation/2.6.18/ScalaAsync
Web 客户端将在等待响应时被阻止,但 服务器上不会阻止任何内容,并且可以 用于为其他客户提供服务。
不过,使用未来只是图片的一半!如果您正在呼叫 对于像JDBC这样的阻塞API,那么你仍然需要有 您的执行阶段使用不同的执行器运行,以将其移开 播放的渲染线程便便
我了解原始 Web 应用程序线程将被释放的部分,但是仍然需要另一个线程来实际执行 CPU 密集型操作,然后计算结果,该结果将传播到客户端(同时被阻止(。
在剧作的动作代码中同步执行什么更好?我们必须增加线程数(因为阻塞请求将消耗线程(,但是服务器上的活动线程总数将保持不变。
有人还可以阐明 Play 如何跟踪被阻止的客户端线程并在非阻塞操作方案中返回响应吗?
使用不同的线程池进行呈现和长时间运行的操作是可取的,因为这样长时间运行的操作就可以使用其池中的所有线程,而不会阻塞渲染。
想象一下这种情况:
- 10 个客户端请求需要长时间运行操作的资源。
- 然后,客户端尝试访问不这样做的资源。
以下是处理此问题的两种方法:
- 您有一个包含 10 个线程的池,用于所有内容。这些填满了您长时间运行的操作,而另一个客户端 - 谁有一个更简单的请求!— 必须等待其中一个长时间运行的调用完成。 您有两个线程池,一个线程池包含 5 个
- 用于呈现的线程,另一个线程池包含 5 个线程,用于长时间运行的操作。呈现线程快速将长时间运行的操作工作提供给另一个池,使它们能够响应第十一个客户端的请求。
第二种情况肯定更好,但我想指出拥有多个线程池的另一个原因:有时不同的操作需要不同类型的系统资源。例如,呈现可能受 CPU 限制,而数据库调用可能主要受网络限制,或受 CPU 限制,但在另一台计算机(数据库服务器(上完成。如果对两者使用相同的线程池,则线程可能会忙于等待网络调用完成,而 CPU 几乎处于空闲状态,即使您有多个 CPU 密集型任务排队也是如此。这将是对资源的低效使用,因此您应该为不同类型的任务使用不同的线程池。