想象一下,像下面这样一个简单的快递web应用。
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
takeTimePlain()
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})
function takeTimePlain () {
/* Long Job Operation Simulation */
let date = Date.now();
let end = Date.now() + 5000;
while (date < end ) {
console.log ("Iterating through while loop")
date = Date.now()
}
return
}
那么我调用的是 http://localhost:3000
3次并发。如果我检查一下延迟或者有些人叫它服务器等待时间。
x
2x
时候3x
旬日如果我们假设10个客户端同时连接到端点,那么第10个客户端应该等待 10x
得到响应的时间。想象一下每秒几千个请求。
为什么Nodejs因其可扩展性、事件驱动和单线程的特性而受到赞扬,甚至在没有外部解决方案的帮助下,如运行同一服务的多个实例,它也不能处理上述常见的情况?
是否有任何非阻塞的替代方案来替代Nodejs?takeTimePlain()
? 我知道 setTimeout(cb, 5000)
然而我在这里的目的不是为了等待5秒钟。这个 takeTimePlain()
可以是任何东西,如排序和数组,排序,查找等。它是一种常见的编码解决方案,复制一个需要cpu时间的过程。
编辑:这个问题不是关于怀疑或建议。这是关于展示实际基准后澄清事实。如果标题不符合内容,请随意编辑。
这个答案有几个部分。
首先节点不是多线程的,从本质上来说,它的所有工作都是异步的。原因是回调和承诺无处不在。你 takeTimePlain
是故意不异步的,所以不是很常见。你的例子本质上是违背范式的。
但如果真的发生了,有几个选择。
A) 生成另一个进程来运行冗长的阻塞代码。
B) 使用 cluster
.
Cluster将允许你在同一个端口上打开任意多的节点https进程。https:/nodejs.orgapicluster.html)。 有很多解决方案,如集群,但集群是建立它的一个。
为了解决 takeTimePlain
你可以用setInterval来代替循环,时间为0,然后在你到达终点时清除它。虽然这样会很慢。
最后一点,nodeexpress不比任何其他解决方案更具可扩展性。