加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 为什么非阻塞Web请求有效,因为我们在两种情况下都持有

发布时间:2020-12-16 18:13:46 所属栏目:安全 来源:网络整理
导读:问题是关于Play框架,尽管概念是通用的. 引用自: https://www.playframework.com/documentation/2.6.18/ScalaAsync The web client will be blocked while waiting for the response,but nothing will be blocked on the server,and server resources can be
问题是关于Play框架,尽管概念是通用的.

引用自:

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

The web client will be blocked while waiting for the response,but
nothing will be blocked on the server,and server resources can be
used to serve other clients.

Using a Future is only half of the picture though! If you are calling
out to a blocking API such as JDBC,then you still will need to have
your ExecutionStage run with a different executor,to move it off
Play’s rendering thread poo

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

如何比在play的动作代码中同步执行执行更好?我们必须增加线程数(因为阻塞请求将使用线程),但服务器上活动线程的总数将保持不变.

有人还可以了解Play如何跟踪被阻止的客户端线程并在非阻塞操作场景中返回响应?

解决方法

使用不同的线程池进行渲染和长时间运行是理想的,因为长时间运行的操作可以使用池中的所有线程而不会阻塞渲染.

想象一下这种情况:

> 10个客户端请求需要长时间运行的资源.
>然后客户端尝试访问没有的资源.

以下是两种可以处理的方法:

>你有一个10个线程的池用于一切.这些填充了您的长期运行,而另一个客户 – 他们的请求更简单! – 必须等待其中一个长时间通话完成.
>您有两个线程池,一个有5个线程用于渲染,另一个有5个线程用于长时间运行.渲染线程快速地将长时间运行的操作工作到另一个池,使它们能够响应第十一个客户端的请求.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读