为什么Node.js是单线程的?

在基于PHP(或Java / ASP.NET / Ruby)的Web服务器中,每个客户端请求都在新线程上实例化。 但是在Node.js中,所有客户端都运行在同一个线程上(它们甚至可以共享相同的变量!)我明白I / O操作是基于事件的,因此它们不会阻塞主线程循环。

我不明白的是为什么Node的作者选择它是单线程的? 它使事情变得困难。 例如,我不能运行CPU密集型函数,因为它阻塞了主线程(并且新的客户端请求被阻塞),所以我需要产生一个进程(这意味着我需要创建一个单独的JavaScript文件并在其上执行另一个节点进程)。 但是,在PHP中,cpu密集型任务不会阻塞其他客户端,因为正如我所提到的,每个客户端都在不同的线程上。 与多线程Web服务器相比,它有什么优势?

注意:我已经使用群集来解决这个问题,但它并不漂亮。


Node.js是作为异步处理实验明确创建的。 理论认为,在单线程上执行异步处理可以在典型的Web负载下提供比典型的基于线程的实现更高的性能和可伸缩性。

你知道吗? 在我看来,理论已被证实。 不使用CPU密集型东西的node.js应用程序可以运行比Apache或IIS或其他基于线程的服务器更多的并发连接。

单线程,异步性质使事情变得复杂。 但是你真的认为它比线程更复杂吗? 一个种族的状况可能会毁了你的整个月! 或者由于某个地方的某些设置而清空线程池,并注意您的响应速度缓慢以至于无法访问! 更不用说死锁,优先级反转,以及多线程的所有其他回转。

最后,我认为这不是普遍的好或坏; 它是不同的,有时它更好,有时不是。 使用正确的工具来完成这项工作。


与一个服务器的“每个请求一个线程”模型相比,问题在于,与事件循环线程模型相比,它们在多个场景下不能很好地扩展。

通常,在I / O密集型方案中,请求会花费大部分时间等待I / O完成。 在此期间,在“每个请求一个线程”模型中,链接到线程的资源(如内存)未使用,内存是限制因素。 在事件循环模型中,循环线程选择下一个事件(I / O完成)来处理。 所以线程总是很忙(如果你正确编程它当然)。

所有新事物的事件循环模型看起来都很有光泽,所有问题的解决方案,但使用哪种模型将取决于您需要解决的情况。 如果您拥有密集型I / O方案(如代理),则事件基本模型将进行规则化,而对于基于线程的模型,具有较少并发进程的CPU密集型方案将最适合。

在现实世界中,大多数场景都会在中间。 您需要平衡对可扩展性的真正需求与开发复杂性以找到正确的体系结构(例如,有一个事件库前端委托后端执行CPU密集型任务,前端将使用少量资源来等待任务结果)。与任何分布式系统一样,它需要一些努力才能使其发挥作用。

如果你正在寻找适合任何场景的银色子弹,那么最终你的脚上会有一颗子弹。


长话短说,节点来自V8,它是内部单线程的。 有办法解决CPU密集型任务的约束。

在某一时刻(0.7),作者尝试引入分离物作为实现多个计算线程的一种方式,但最终被删除:https://groups.google.com/forum/#!msg/nodejs/zLzuo292hX0/F7gqfUiKi2sJ

链接地址: http://www.djcxy.com/p/52503.html

上一篇: Why is Node.js single threaded?

下一篇: Don't understand the callback and non