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

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

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

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

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

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

单线程,asynchronous性使事情变得复杂。 但是,你真的认为这比线程更复杂吗? 一个种族的状况可以毁了你的整个月! 或者由于某个地方的某个设置而清空线程池,并且观察您的响应时间变慢了! 更不用说死锁,优先倒置,以及multithreading的所有其他回转。

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

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

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

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

在现实世界中,大部分的情景会有些中间。 您需要平衡真正的可伸缩性需求和开发复杂性,以find正确的架构(例如,有一个事件库前端委托后端执行CPU密集型任务,前端将使用less量资源来等待任务结果)。与任何分布式系统一样,它需要一些努力才能使其工作。

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

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

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