在Nodejs上下文中,为什么存在 "Don't Block Event Loop "这句话,即使在开发中也无法避免?

问题描述 投票:-1回答:1

想象一下,像下面这样一个简单的快递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时间的过程。

编辑:这个问题不是关于怀疑或建议。这是关于展示实际基准后澄清事实。如果标题不符合内容,请随意编辑。

node.js express scalability nonblocking event-loop
1个回答
1
投票

这个答案有几个部分。

首先节点不是多线程的,从本质上来说,它的所有工作都是异步的。原因是回调和承诺无处不在。你 takeTimePlain 是故意不异步的,所以不是很常见。你的例子本质上是违背范式的。

但如果真的发生了,有几个选择。

A) 生成另一个进程来运行冗长的阻塞代码。

B) 使用 cluster.

Cluster将允许你在同一个端口上打开任意多的节点https进程。https:/nodejs.orgapicluster.html)。 有很多解决方案,如集群,但集群是建立它的一个。

为了解决 takeTimePlain 你可以用setInterval来代替循环,时间为0,然后在你到达终点时清除它。虽然这样会很慢。

最后一点,nodeexpress不比任何其他解决方案更具可扩展性。

© www.soinside.com 2019 - 2024. All rights reserved.