理解Node.js中代码执行的阻塞和非阻塞
现在,我们有一个在fs模块中的writeFileSync文件写入函数,如下所示:
const requestBody = []; req.on('data', (chunks)=>{ requestBody.push(chunks); }); return req.on('end', ()=>{ const parsedData = Buffer.concat(requestBody).toString(); const username = parsedData.split('=')[1]; fs.writeFileSync('username.txt', username); //redirect res.statusCode=302; res.setHeader('Location','/'); return res.end(); });
Sync表示同步。这是一个阻塞代码示例。只有在文件写入完成后,文件的其余代码执行才会开始。上面的代码比较简单,但是如果我们有一个大型的文件处理操作,它会导致应用程序性能下降。
这种代码执行方式会减慢其他请求的速度,最终影响应用程序的性能。
解决这个问题的方法是使用文件的异步写入函数。我们在fs模块中有writeFile函数,它是异步的。下面是一个例子:
return req.on('end', ()=>{ const parsedData = Buffer.concat(requestBody).toString(); const username = parsedData.split('=')[1]; fs.writeFile('username.txt', username, (error)=>{ console.log(error); }); //redirect res.statusCode=302; res.setHeader('Location','/'); return res.end(); });
writeFile函数多接收一个参数,即错误对象。如果在完成文件处理函数时出现任何错误,我们可以在控制台中检查该错误。
这样我们就可以避免代码阻塞。在文件处理中,Node.js可以使用操作系统的多线程方法来提高性能。它只是注册事件并在以后的特定点执行它们。
异步是Node.js中处理操作最常用的方式,例如从服务器获取数据、操作数据、分页等。
readFile和readFileSync:
与writeFile函数类似,我们也有readFile文件读取函数,它们也分为阻塞和非阻塞方式。
readFile是非阻塞的,readFileSync是阻塞的。我们可以使用Promise来处理尚未完成但完成后会返回resolve的操作。
PromiseOperationFunction() .then( ()=> console.log(‘completed with succes’); ) .catch((err)=> console.log(‘completed with failure’); );
广告