参考以下讨论: How is Node.js inherently faster when it still relies on Threads internally?
在完成所有回复之后,我仍然有一些基本问题:如果进行了数据库调用,“某人”必须阻止该回调。它变成了内心深处的阻塞。有人必须打电话给DB。 '某人'必须是一个线程。如果有50个DB调用,虽然它们似乎对Javascript没有阻塞,但在内心深处它们都被阻止了。如果有50个调用,为了将它们全部一起发送到DB上,它们必须通过一个线程分别发送给DB。这意味着将有50个线程已发送数据库调用并正在等待其调用返回。这与拥有50个线程没有什么不同,就像在Apache中一样。请纠正我的理解。什么是Node.js巧妙地做,以及如何确保在这种情况下运行的线程少于50?
答案 0 :(得分:1)
你......部分正确。如果有50个并发数据库调用,则表示50个线程,每个线程专用于数据库调用(实际上,实际上是默认情况下,节点在其线程池中仅提供4个并发线程,如果你想要更多,你必须明确指定你愿意允许节点启动的线程数;请参阅我的回答here - 任何多余的请求都排队等待。
这比Apache更有效的原因是每个线程都专用于最小的功能单元......它仅在数据库调用的生命周期中存在,然后它被放弃(在这种情况下,新的线程是创建,达到限制,然后该线程被放回池中)。这与Apache形成了极大的对立,它为每个新请求创建了一个线程,并且可能必须服务于多个数据库调用和其他处理,直到该请求完成,然后可以放弃。
最终,这导致每个线程花费更多的时间在工作中或在池中等待更多的工作,更少的时间闲置和不可用。
请注意,这与工作负载有关,有些工作负载在Apache模型中运行得更好,但一般来说,大多数 Web样式工作负载更适合于节点模型。
答案 1 :(得分:0)
不同之处在于我相信像apache这样的东西,这些线程将按接收顺序处理。因此,如果线程1正在等待10TB的数据而线程2只等待10KB的数据,则线程2必须等到线程1完成,即使它的工作可以更快地完成并且返回更快。对于节点,想法是每个等待I / O的线程在完成后立即返回。因此,根据I / O,相同的情况可能允许线程2在第一个线程完成之前返回它的工作。这是较旧但仍然是一个很好的写作我相信在节点中的线程。 http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/