Node.js 中的阻塞和非阻塞
Node.js 基于事件驱动的非阻塞 I/O 模型。本文讨论 Node.js 中的阻塞和非阻塞是什么意思。
阻塞:是指阻塞进一步的操作,直到当前操作完成。阻塞方法是同步执行的。同步意味着程序逐行执行。程序一直等到被调用的函数或操作返回。
示例:以下示例使用 readFileSync()函数读取文件并演示 Node.js 中的阻塞
index.js
const fs = require('fs');
const filepath = 'text.txt';
// Reads a file in a synchronous and blocking way
const data = fs.readFileSync(filepath, {encoding: 'utf8'});
// Prints the content of file
console.log(data);
// This section calculates the sum of numbers from 1 to 10
let sum = 0;
for(let i=1; i<=10; i++){
sum = sum + i;
}
// Prints the sum
console.log('Sum: ', sum);
index.js
const fs = require('fs');
const filepath = 'text.txt';
// Reads a file in a asynchronous and non-blocking way
fs.readFile(filepath, {encoding: 'utf8'}, (err, data) => {
// Prints the content of file
console.log(data);
});
// This section calculates the sum of numbers from 1 to 10
let sum = 0;
for(let i=1; i<=10; i++){
sum = sum + i;
}
// Prints the sum
console.log('Sum: ', sum);
使用以下命令运行index.js文件:
node index.js
输出:
This is from text file.
Sum: 55
非阻塞:它指的是不阻塞进一步操作的执行的程序。非阻塞方法是异步执行的。异步意味着程序不一定会逐行执行。程序调用该函数并移动到下一个操作并且不等待它返回。
示例:以下示例使用 readFile()函数读取文件并演示 Node.js 中的非阻塞
index.js
const fs = require('fs');
const filepath = 'text.txt';
// Reads a file in a asynchronous and non-blocking way
fs.readFile(filepath, {encoding: 'utf8'}, (err, data) => {
// Prints the content of file
console.log(data);
});
// This section calculates the sum of numbers from 1 to 10
let sum = 0;
for(let i=1; i<=10; i++){
sum = sum + i;
}
// Prints the sum
console.log('Sum: ', sum);
使用以下命令运行index.js文件:
node index.js
输出:
Sum: 55
This is from text file.
注意:在非阻塞程序中,总和实际上在文件内容之前打印。这是因为程序不等待 readFile()函数返回并移动到下一个操作。当 readFile()函数返回时,它会打印内容。