CNode

关于nodejs源码的疑问

Aandyzhang发布于13 年前最后回复13 年前9 回复4798 浏览0 收藏

各位 我在研究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)

A
andyzhang#1·13 年前

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

L
leapon#2·13 年前

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

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

S
shiedman#3·13 年前

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

L
leizongmin#4·13 年前

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

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

A
andyzhang#5·13 年前
引用 shiedman以主线程指代执行用户代码的线程为前提 问题1:NO。实际的file open是在其他线程执行的,否则主线程会阻塞 问题2:callback在主线程执行。所有的用户代码(我们写的javascri...

嗯,多谢你的回复

   那IOCP里面的thread pool里面的thread是用作什么的呢?据说他们是用来处理IO完成之后的事情的,不知道对不对
L
leizongmin#7·13 年前
引用 leizongmin这文章上有提到:http://blog.csdn.net/pusongyang/article/details/8824373 读取IO时不占用JavaScript引擎的线程,只有当回调的时候...

@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完成一项任务,它的回调函数就会被触发。但是一次只能触发一个回调函数,直到回调函数执行完毕了,所有其它回调函数都在排队.除了这点,不能保证下一步触发哪个回调函数

L
leizongmin#8·13 年前

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

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

A
andyzhang#9·13 年前
引用 leizongmin这文章上有提到:http://blog.csdn.net/pusongyang/article/details/8824373 读取IO时不占用JavaScript引擎的线程,只有当回调的时候...

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

参与回复
登录后即可参与回复。登录