关于nodejs源码的疑问
发布于 12 年前 作者 andyzhang 4298 次浏览 最后一次编辑是 8 年前

各位 我在研究node异步IO的时候参考了http://www.infoq.com/cn/articles/nodejs-asynchronous-io, 现有疑问希望和大家共同探讨 1. nodejs的open file操作,最终调用到了一个CreateFileW的函数上面,我想问下,真正到最后的file open操作是在node主线程里面做的么? 如果不是那是在哪里完成的? 2. file open之后,是把callback交给了IOCP里面的某个空闲thread来做,以前好像看到过callback是在node主线程里面处理的,不知道到底是哪个正确

 请各位多多指教
9 回复

不会是大家都不看源码吧……

好文章。没看到c上,js文件就够研究的了。

http://www.infoq.com/cn/articles/nodejs-asynchronous-io

以主线程指代执行用户代码的线程为前提 问题1:NO。实际的file open是在其他线程执行的,否则主线程会阻塞 问题2:callback在主线程执行。所有的用户代码(我们写的javascript代码)只能在主线程上跑,callback代码还是属于用户代码的范畴,so… 如果callback是在某个空闲的thread来做,那node.js就是多线程,从而引入复杂的同步问题。

这文章上有提到:http://blog.csdn.net/pusongyang/article/details/8824373

读取IO时不占用JavaScript引擎的线程,只有当回调的时候,排队执行callback

嗯,多谢你的回复

   那IOCP里面的thread pool里面的thread是用作什么的呢?据说他们是用来处理IO完成之后的事情的,不知道对不对

我觉得他说的比较大,并没有代码层次的实现

@andyzhang 里面的例子已经说清楚原理了。

当然,一个node程序的例子,如下:

var fs = require('fs')
  , sys = require('sys');

fs.readFile('treasure-chamber-report.txt', function(report) {
  sys.puts("oh, look at all my money: "+report);
});

fs.writeFile('letter-to-princess.txt', '...', function() {
  sys.puts("can't wait to hear back from her!");
});

你的代码给node两项任务:读和写文件,然后它睡觉。一旦node完成一项任务,它的回调函数就会被触发。但是一次只能触发一个回调函数,直到回调函数执行完毕了,所有其它回调函数都在排队.除了这点,不能保证下一步触发哪个回调函数

“所以,我不用担心代码同时访问同一个数据结构吗?”

对的!这正是JavaScript 单线程/事件循环设计的美妙之处。

@leizongmin 嗯嗯,这个我明白,我想知道的是,首先,file read write的操作最终是那个thread在做,然后做完了,利用iocp里面的thread处理的是什么?如果是callback,那么很明显和“node main thread处理”相违背

回到顶部