为什么非阻塞 Web 请求是有效的,因为我们在这两种情况下都持有服务器线程



这个问题是关于Play框架的,尽管概念是通用的。

引用自:

https://www.playframework.com/documentation/2.6.18/ScalaAsync

Web 客户端将在等待响应时被阻止,但 服务器上不会阻止任何内容,并且可以 用于为其他客户提供服务。

不过,使用未来只是图片的一半!如果您正在呼叫 对于像JDBC这样的阻塞API,那么你仍然需要有 您的执行阶段使用不同的执行器运行,以将其移开 播放的渲染线程便便

我了解原始 Web 应用程序线程将被释放的部分,但是仍然需要另一个线程来实际执行 CPU 密集型操作,然后计算结果,该结果将传播到客户端(同时被阻止(。

在剧作的动作代码中同步执行什么更好?我们必须增加线程数(因为阻塞请求将消耗线程(,但是服务器上的活动线程总数将保持不变。

有人还可以阐明 Play 如何跟踪被阻止的客户端线程并在非阻塞操作方案中返回响应吗?

使用不同的线程池进行呈现和长时间运行的操作是可取的,因为这样长时间运行的操作就可以使用其池中的所有线程,而不会阻塞渲染。

想象一下这种情况:

  1. 10 个客户端请求需要长时间运行操作的资源。
  2. 然后,客户端尝试访问不这样做的资源。

以下是处理此问题的两种方法:

  1. 您有一个包含 10 个线程的池,用于所有内容。这些填满了您长时间运行的操作,而另一个客户端 - 谁有一个更简单的请求!— 必须等待其中一个长时间运行的调用完成。
  2. 您有两个线程池,一个线程池包含 5 个
  3. 用于呈现的线程,另一个线程池包含 5 个线程,用于长时间运行的操作。呈现线程快速将长时间运行的操作工作提供给另一个池,使它们能够响应第十一个客户端的请求。

第二种情况肯定更好,但我想指出拥有多个线程池的另一个原因:有时不同的操作需要不同类型的系统资源。例如,呈现可能受 CPU 限制,而数据库调用可能主要受网络限制,或受 CPU 限制,但在另一台计算机(数据库服务器(上完成。如果对两者使用相同的线程池,则线程可能会忙于等待网络调用完成,而 CPU 几乎处于空闲状态,即使您有多个 CPU 密集型任务排队也是如此。这将是对资源的低效使用,因此您应该为不同类型的任务使用不同的线程池。

相关内容

最新更新