nodejs非阻塞特性

传统的编程语言模型中似乎很少有提及非阻塞这个特性的,至少对于我来说,对这个概念很是不解。习惯了阻塞式的编程,在来看nodejs的非阻塞特性,感觉很是新奇,也感觉这种特性更加合理、有效率。

就我理解的来说,阻塞就是在运行一段程序的时候,后续的程序段都是被阻塞的、无法运行的。这样资源便得不到充分利用,效率上来说就有点折扣。而对于非阻塞的程序来说,运行时间长的程序并不会阻塞其它程序段得运行。

访问文件作为例子,传统的步骤一般是打开文件,然后读取或写入,然后关闭文件。

fp = File.open('foo.txt', 'r')
fp.each_line do |line| 
  puts line 
end
fp.close()

puts 'end here'

打开文件,读取其中的内容,输出内容。在文件内容没有处理完,是无法执行其后的程序的。再看一下nodejs是如何处理这样的情况的。

var fs = require('fs');

fs.readFile('foo.txt', 'utf-8', function(err, data) {
    if (err) throw err;    
    console.log(data);    
});

console.log('first start');

在nodejs中,程序会在读取文本内容的时候,不会阻塞其它程序的运行,在这个小程序中就没有阻塞console.log的输出。当文本处理完成,然后才会输出文本的内容。

现实应用中,应该有很多地方需要非阻塞这种编程模型的。Ajax的通信机制就是这种模型,至于其它的语言如何去实现,有待于学习。理解限于此。

现在还没有评论

留下您的大名