Node.js初体验

node.js是一直想探索的一个开源项目。 这几天闲来无事看了一些相关tutorial,并将中文分词CppJieba整合进去可以让node.js调用。

node 初体验

node是著名的异步IO高并发单线程的server

从node/deps这个目录下就可以看到大概node的整体思路: * v8 : google出品的js引擎 * uv : 跨平台的网络事件库 * others : 其他就是作为工具类,比如http参数解析,ssl加密等。

首先注意到node是单线程的,但是却是高并发的,这两者看似矛盾,但是也不难理解。主要是归功与uv这个库,uv本质上就是一个事件驱动的库。

可以把uv理解为是对epoll之类的一个封装,epoll就是一个高并发的事件驱动的IO多路复用网络服务器。 或者,直接理解为中断信号编程,我们注册一些事件,当这些事件发生的时候,系统自动调用我们注册好的事件回调函数。 这样的好处是非阻塞,同时也方便做到高并发,所以在开发nodejs的时候和一般的开发不一样,把可能耗时较多的函数注册成回调函数。

所以按我的理解,node其实可以看成是一个c++写好了若干网络服务库,但是引入了v8,让我们可以简单的使用js来调用这些牛逼的服务库,嗯,就是这样。

单线程和异步IO

照着《node入门》教程写代码就会遇到nodejs与众不同的编程方法,在传统编程方法中, 代码逻辑都是同步运行,如果要进行并行的话则需要多线程或者多进程,如传统的网络服务器Apache, Nginx。 而nodejs天生支持异步编程,实际代码就是各种使用回调函数。 至于为什么nodejs天生支持异步编程函数,就是在实际编程中为何将回调函数传入某些库函数之后会发生什么事情? 其实本质上就是libuv的功劳,大概的原因就是用多线程和阻塞IO来模拟异步。

使用c++为node写扩展

写扩展说起来很屌,但是其实在node里面,重点主要是要了解v8的相关api, 了解v8里面定义的Handle,Scope等概念,依样画葫芦即可。

作为练手将之前写的CppJieba包装了一下,成了NodeJieba,算是能用,但是因为也是node新手,很多不好的地方之后再慢慢完善了。 详见这里

关于具体如何写和如何在npm上发布,详见这里

还有一些想说的

  • CppJieba全写成hpp文件用起来真是爽
  • npm 发布和管理项目真心赞

参考

转载请注明出处: Node.js初体验