24

node.js 可扩展,那是什么意思?node.js 服务器的哪一部分是可扩展的。我读到它是一种单线程技术,不适合需要大量 CPU 资源的应用程序。这些事实不符合可扩展性,那么这是什么意思呢?

4

4 回答 4

18

node 运行的 javascript 是单线程的,但是你在 node 中调用的很多东西——比如网络或文件 io——在后台线程中运行。有关基本概述,请参阅此帖子: 节点不是单线程的

如果您需要详细的细节,您应该查看 libuv,它是将线程转换为事件循环的“神奇”部分:http: //nikhilm.github.io/uvbook/basics.html#event-loops

此外,如果您需要在节点本身中执行 CPU 密集型操作,您可以轻松地将其发送到子进程 -有关详细信息,请参阅http://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options

于 2013-06-05T21:25:52.723 回答
3

那不是“本身”更具可扩展性。您所做的不仅仅是(I/O)可扩展,而无需做任何特别的事情。

I/O 更安全,更容易并行执行,因为它倾向于在执行线程之间不共享任何数据。Node.js 让您可以使用简单、优雅且易于使用的事件编程来完成它。是一种古老且经过验证的编程范例,多年来被 GUI 和其他图形密集型应用程序(例如游戏)使用。

事实上,它的可扩展性不如 c++、c、java 等成熟的语言。通过使用完整的多线程可以更好地扩展。这也允许扩展 CPU,但也打开了一罐蠕虫。要共享 CPU,您必须共享数据,这是另一回事(信号量、锁等......)

您可以使用上述任何语言执行与 node.js 相同的操作,但它不是语言本身的一部分,因此您必须自行开发或使用提供给您的库。也就是说,并不难,但肯定比 node.js 更难。

大多数 Web 服务都是 IO 绑定的,因此 Node.js 非常适合,并且在大多数情况下都可以。但是,一旦您开始使用 CPU 密集型工作,事件就不会被处理并且全部停止。在这种情况下,最好使用另一种语言。Node 中没有真正好的解决方案。您可以生成多个进程,但是您将无法在它们之间共享数据。没有数据共享,就无法有效地扩展 CPU,所以最好不要尝试。

使用 Node.js 进行 IO,以及一些更适合的语言,以及适当的多线程处理 CPU 密集型工作。

于 2014-04-23T01:11:57.143 回答
2

由于负载平衡,它是可扩展的。从本质上讲,您可以让节点处理多个作业,并且它可以处理它而没有很大的负担。这使其可扩展。

于 2013-06-05T20:43:58.950 回答
0

Node 的所有 API 都是以支持回调的方式编写的。

例如,读取文件的函数可以开始读取文件并立即将控制返回到执行环境,以便执行下一条指令。一旦文件 I/O 完成,它会调用回调函数,同时将文件的内容作为参数传递给回调函数。因此没有阻塞或等待文件 I/O。这使得 Node.js 具有高度可扩展性,因为它可以处理大量请求而无需等待任何函数返回结果。-- 教程的要点。

于 2015-10-06T14:32:15.357 回答