Glitter2008 2022-09-09 18:47 采纳率: 100%
浏览 15
已结题

有关node.js异步IO调用原理的问题

有关node.js异步IO调用原理的问题

在Win10中做Node.js实验,看下面的代码:

const fs=require('fs');
fs.writeFile('./file.txt','Hello world!',function(err){
    console.log('done.');
});
console.log('finished.');

很多资料称,对于fs这类模块而言,调用fs.writeFile方法时,Nodejs会从线程池中取出一个新的线程,把写文件的操作放在这个新线程中执行。如果这种说法是事实,那么上面的代码(主线程)应当和新线程并行。我希望验证到这一点,于是我故意将主线程拖延数秒,修改代码如下:

const fs=require('fs');
fs.writeFile('./file.txt','Hello world!',function(err){
    console.log('done.');
});
console.log('loop begins....');
for(var i=0;i<10000000000;i++){}   //会拖延数秒
console.log('finished.');

如果主线程和新线程是并行的,那么写文件的操作应该在主线程陷入for循环的这数秒内快速完成。但结果却出乎意料,在for循环的这段时间里file.txt文件的大小始终是0Byte。直到主线程finished,file.txt中才出现内容。这貌似说明writeFile操作被安排在了当前代码的后面,两者被串行了。我又用readFile做了一次实验,代码如下:

const fs=require('fs');
fs.readFile('./test.iso',function(err,data){
    console.log('done.');
});
console.log('loop begins....');
for(var i=0;i<10000000000;i++){}   //会拖延数秒
console.log('finished.');

其中,file.iso是我随便找来的一个文件,大小将近700MB。运行程序后,我观察资源监视器。的确是先单独执行for循环,主线程finish后才开始向内存提交数据,仍然是把操作串行起来。不过,通过观察资源监视器可以验证一个事实,fs的确开启了新线程。
我又转移到Linux中做同样的实验,结论与上面一致。
这个现象令我十分费解,恳请指点:fs开启的新线程(异步IO操作)为什么不能和主线程并行?是我运行node时遗漏了什么参数吗?还是我没有理解哪个重要概念?如果这些操作必须串行起来,那么开启新线程的意义是什么呢?谢谢。

  • 写回答

1条回答 默认 最新

  • web修理工 2022-09-13 14:01
    关注

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月22日
  • 已采纳回答 9月14日
  • 创建了问题 9月9日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么