Nodejs入门 阻塞与非阻塞

Nodejs入门 阻塞与非阻塞

node入门 阻塞与非阻塞

这一章节没有像预想那样延时执行/upload 没有延时执行,只有start 延时执行了.检测过代码没错。求解惑。

3 回复

当然可以!以下是一个关于Node.js中阻塞与非阻塞操作的详细解释,并附带一些示例代码。

Node.js中的阻塞与非阻塞

在Node.js中,理解阻塞(blocking)与非阻塞(non-blocking)操作是非常重要的,因为这直接关系到程序的性能和响应能力。

阻塞操作

阻塞操作是指在执行过程中会暂停当前线程的执行,直到该操作完成。例如,读取文件或进行网络请求等操作,如果使用阻塞方式,则整个程序将在此期间停止响应其他任务。

示例代码:

const fs = require('fs');

console.log('开始读取文件...');

// 阻塞方式读取文件
const data = fs.readFileSync('/path/to/file.txt', 'utf8');
console.log(data);

console.log('读取文件结束。');

在这个例子中,fs.readFileSync 是一个阻塞方法。当程序执行到这行代码时,它会暂停并等待文件读取完成,然后再继续执行后续代码。

非阻塞操作

非阻塞操作则允许程序在执行某些耗时的操作时,继续处理其他任务。这对于提高程序的响应性和性能非常有用。

示例代码:

const fs = require('fs');

console.log('开始读取文件...');

// 非阻塞方式读取文件
fs.readFile('/path/to/file.txt', 'utf8', (err, data) => {
    if (err) throw err;
    console.log(data);
});

console.log('读取文件结束。');

在这个例子中,fs.readFile 是一个非阻塞方法。当程序执行到这行代码时,它不会暂停等待文件读取完成,而是继续执行后续代码。一旦文件读取完成,回调函数会被调用,处理读取到的数据。

示例解析

在你提到的例子中,如果你希望 /upload 路由也延时执行,可以考虑使用非阻塞的方式来模拟延迟效果:

const express = require('express');
const app = express();

app.get('/start', (req, res) => {
    setTimeout(() => {
        res.send('Start route has been delayed.');
    }, 2000); // 延迟2秒
});

app.get('/upload', (req, res) => {
    setTimeout(() => {
        res.send('Upload route has also been delayed.');
    }, 2000); // 延迟2秒
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

在这个例子中,我们使用 setTimeout 来模拟延迟效果,这样两个路由都会延时执行。

希望这些解释和示例代码能够帮助你更好地理解Node.js中的阻塞与非阻塞操作。


主要是exec|spawn(XXXX, function (error, stdout, stderr) {})作怪

在Node.js中,阻塞和非阻塞操作是理解其异步特性的重要概念。阻塞操作会暂停程序的执行,直到该操作完成;而非阻塞操作则不会阻塞主线程,允许其他任务继续执行。

示例代码

假设我们有一个简单的文件读取操作。我们可以用阻塞的方式(fs.readFileSync)和非阻塞的方式(fs.readFile)来实现。

阻塞方式

const fs = require('fs');

console.log('开始读取文件...');

// 阻塞方式读取文件
let data = fs.readFileSync('/path/to/file.txt');
console.log(data.toString());

console.log('读取完成。');

在这个例子中,当程序运行到fs.readFileSync时,它会阻塞当前线程,直到文件读取完成。这意味着console.log('读取完成。')将在文件读取完成后才被执行。

非阻塞方式

const fs = require('fs');

console.log('开始读取文件...');

// 非阻塞方式读取文件
fs.readFile('/path/to/file.txt', (err, data) => {
    if (err) throw err;
    console.log(data.toString());
});

console.log('读取完成。');

在这个例子中,fs.readFile是非阻塞的,因此console.log('读取完成。')会在文件读取完成之前被执行。文件读取的结果将在回调函数中处理。

总结

阻塞操作会使程序等待操作完成,而非阻塞操作则不会阻塞主线程。理解这一点对于编写高效的Node.js应用非常重要。

回到顶部