scala – 为什么非阻塞Web请求有效,因为我们在两种情况下都持有
问题是关于Play框架,尽管概念是通用的.
引用自: https://www.playframework.com/documentation/2.6.18/ScalaAsync
我理解原始Web应用程序线程将被释放的部分,但是仍然需要另一个线程来实际执行cpu密集型操作然后计算结果,该结果将传播到客户端(同时被阻止). 如何比在play的动作代码中同步执行执行更好?我们必须增加线程数(因为阻塞请求将使用线程),但服务器上活动线程的总数将保持不变. 有人还可以了解Play如何跟踪被阻止的客户端线程并在非阻塞操作场景中返回响应? 解决方法
使用不同的线程池进行渲染和长时间运行是理想的,因为长时间运行的操作可以使用池中的所有线程而不会阻塞渲染.
想象一下这种情况: > 10个客户端请求需要长时间运行的资源. 以下是两种可以处理的方法: >你有一个10个线程的池用于一切.这些填充了您的长期运行,而另一个客户 – 他们的请求更简单! – 必须等待其中一个长时间通话完成. 第二种情况肯定更好,但我想指出拥有多个线程池的另一个原因:有时不同的操作需要不同类型的系统资源.例如,渲染可能是CPU绑定的,而数据库调用可能主要是网络绑定的,或者是CPU绑定的,但是在不同的机器(数据库服务器)上完成.如果对两者使用相同的线程池,则线程可能会忙于等待网络调用完成,而CPU主要处于空闲状态,即使您有多个CPU绑定任务排队.这将是对资源的低效使用,因此您应该为不同类型的任务使用不同的线程池. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |