与node.js VS apache HTTPD混淆

时间:2013-11-22 10:22:34

标签: multithreading node.js

我对节点和线程之间的区别感到困惑。现在在httpd文档中,他们说他们创建了一个主进程,它创建了一个子进程,而进程又维护了固定数量的线程。

线程池就像Apache的pre-forking一样。线程是在en中创建的 在程序启动时阻塞,然后均匀分配工作负载。 当连接多于线程时,新连接具有 等待。但从好的方面来说,您可以节省创建线程的成本。

现在我怀疑是因为线程可以运行共享内存,为什么不能创建任意数量的线程?

说到节点。 Node完全由事件驱动。基本上,服务器由一个接一个处理一个事件的线程组成。一个新的请求是一种事件。服务器开始处理它,当有阻塞IO操作时,它不会等到它完成,而是注册一个回调函数。然后服务器立即开始处理另一个事件(可能是另一个请求)。当IO操作完成时,这是另一种事件,服务器将通过一旦有时间执行回调来处理它(即继续处理请求)。

现在,如果节点没有创建新线程,那么它如何接受新请求。

2 个答案:

答案 0 :(得分:2)

来自博客Understanding the node.js event loop

Node.js为您的代码保留一个线程......

它实际上是一个单线程运行:你不能执行任何并行代码执行;例如,进行“休眠”将阻止服务器一秒钟:

源代码

while(new Date().getTime() < now + 1000) {
   // do nothing
}

因此,当代码运行时,node.js不会响应来自客户端的任何其他请求,因为它只有一个用于执行代码的线程。或者,如果您有一些CPU密集型代码,比如说,用于调整图像大小,那么仍会阻止所有其他请求。

查看博客了解更多详情。它详细解释了事件循环。

修改

检查一下,一个很好的参考 Multi-Process Node.js: Motivations, Challenges and Solutions

答案 1 :(得分:1)

JavaScript的问题在于,它是众所周知的单线程。因此,线程不能简单存在(有一些复杂的解决方案,但最终这些解决方案往往非常复杂)。 Node.js使用非阻塞IO方法来规避这种限制,最终通过避免任何阻塞来使用单线程,并且让这些任务经常暂停一秒钟让其他人做一些工作。 。与Windows 95-ME中旧的单核多任务仿真类似。

现在最大的问题是:如果任何处理线程都被搁置,那么整个服务器将被搁置。只要您小规模地工作,这不是问题,但对于大型服务器环境而言,这绝对是不可取的。此外,现代服务器拥有8个或更多核心,其中7个闲置是浪费硬件。

worker配置中的HTTPD会生成一个自身的fork(原始可执行文件就像以防万一),然后根据配置的值生成线程。它理论上可以同时运行1000个线程,但如果你的CPU只有8个内核,那么一次只能处理8个线程 - 显然。所以其他992个线程需要等待,这可能 - 取决于任务 - 甚至导致客户端遇到超时,因为他们必须等待超过30秒。

一个好的值有多少线程主要取决于你的线程做什么。如果它们永远不会阻塞,而是花费100%的时间来实际解决问题,那么关于内核* 2对于httpd来说是一个很好的价值,因为如上所述的核心限制。如果您的线程阻塞很多(磁盘访问,tcp通信),那么更高或更高的值可能会导致更好的吞吐量。最后,找到答案的唯一方法是针对服务器启动测试数据并测量各种配置的吞吐量。

然而,现代Web服务器(httpd已有几个世纪的历史)将这两种方法结合起来:一种非阻塞的单接收器线程,它读取数据然后将其分发给可用的线程。这样做的好处是IO操作非常快(如果代码是本机代码,甚至比node.js更快),但仍然可以同时使用所有内核。 Java可以通过NIO(新IO)执行此操作,然后将Runnables分发到Executors