[已解决]如何理解Nodejs单线程?
[已解决]如何理解Nodejs单线程?
看这篇文章的时候对以下这句话不理解,求指教。 文章:http://cnodejs.org/topic/50462f51329c5139760bff98#528c7479d2b3893f2ab4939e
“Apache是多线程的:它为每个请求开启一个新的线程(或者是进程,这取决于你的配置),当并发连接增多时,你可以看看它是怎么一点一点耗尽内存的。Nginx和Node.js不是多线程的,因为线程的消耗太“重”了。”
请问这句话怎么理解,难道node是一个线程处理多个请求? 比如有三个人同时访问一个node站点,这三个请求是一个线程处理还是三个线程处理?
写了段代码验证了一下,确实是一个线程处理多个请求,感谢各位。 下面这段代码 同时开两个标签页请求,第二个标签页会等10秒才显示hello
var http = require('http');
var wait = function(millisec) {
var now = new Date;
while(new Date - now <= millisec) ;
}
http.createServer(function(req, res){
wait(5000);
res.writeHead(200, {'Content-Type': 'text/html'});
res.end('hello');
}).listen(3000);
一个线程处理这3个请求。
NodeJS是运行的多线程,Nodejs 说过当你要执行一个很耗时间的操作,那么请你创建一个线程。 他的机制是异步回调,windows采用IOCP机制,linux采用epoll
"Nodejs 说过当你要执行一个很耗时间的操作,那么请你创建一个线程" 很耗时的操作是指io吗? 你的意思是node会另起一个线程进行io? 如果是这个意思那我不同意你的说法
《深入浅出node.js》前几章对这个问题有很清晰的解释。
Node.js 是单线程的,这意味着它使用一个主线程来处理所有操作,而不是为每个请求创建一个新的线程。这是 Node.js 高效处理并发请求的关键之一。
单线程 vs 多线程
- 单线程: 在 Node.js 中,所有的请求都由一个主线程处理。这种模型避免了线程间的上下文切换开销,使得 Node.js 能够高效地处理大量的并发请求。
- 多线程: 例如 Apache 使用多线程模型,每个请求都会分配一个单独的线程。当并发请求增加时,创建和管理大量线程会导致资源消耗过大,影响性能。
示例代码
下面是 Node.js 如何处理并发请求的一个简单示例:
const http = require('http');
// 模拟一个耗时操作
function wait(millisec) {
const start = Date.now();
while (Date.now() - start <= millisec);
}
http.createServer((req, res) => {
// 模拟一个 5 秒的延迟
wait(5000);
// 发送响应
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World\n');
}).listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
在这个例子中,如果两个请求几乎同时到达,第二个请求会被阻塞,直到第一个请求完成。这说明 Node.js 的单线程模型在遇到 CPU 密集型任务时会导致阻塞问题。
为了应对这个问题,Node.js 提供了异步非阻塞 I/O 操作,使它可以处理大量的并发请求而不被阻塞。例如,可以使用 setTimeout
来代替同步的 wait
函数,从而避免阻塞主线程。
const http = require('http');
http.createServer((req, res) => {
setTimeout(() => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World\n');
}, 5000);
}).listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
通过这种方式,即使第一个请求在等待 5 秒钟,其他请求也可以继续被处理,不会被阻塞。