疑难杂症!!!请高手指教!!!如果理解NODEJS是单进程????
发布于 7小时前 作者 flftfqwxf 173 次浏览 来自 问答

新手初学,关于NODEJS单进程有几个疑问,请大侠些指教。 1)许多资料都说明,NODEJS为单进程,故如果项目中一个页面报错,整个项目都会挂掉,在本地试过,当一个页面出错时,会【exited with code 1】。那如果避免这种一个页面错误,而引进的全站挂的情况,是否有强制容错的机制,或者捕获错误,而不会【exited with code 1】。 2)个人理解NODEJS的单进程,是指个人写的代码为单进程进行,而不是指整个NODEJS服务为单进程,关于此点,与其他的语言【比如PHP】,有何不同??是否是指其他的语言,可以通过配置,而使用多进程,或者可以在代码里使用多个子进程来实现某些功能?? 3)基于第二点个人理解,NODEJS的child_process 算不算多进程的一种实现??

请大家指教!!!谢谢

8 回复

1)有 try catch 2)php 来一个request 就要一个线程。所以一般性能的电脑,比如普通虚拟机可以同时处理 10k 个请求。http://www.kegel.com/c10k.html。 这个链接有点老,不过你懂这个意思 3)node 把那些耗时的io也开新线程的。

process.on('uncaugthException', function(err) {
  console.log(err);
});

第一个问题可以用错误捕获,try/catch。还可以用pm2等工具监控,自动重启。 不建议捕获全局的uncaugthException,有错误即时退出重启,不要让错误累计,尤其是有些致命性错误必须重启。

child_process 可以实现多进程。你还可以用cluster来实现,主进程可以监控子进程的状态,如果发现子进程死掉可以立即重启。 跟PHP比,node.js的进程建立一定数量之后,只要不发生错误,进程一直存活的。主进程监听某个端口,来了请求,转到某个进程上处理,进程内部是用异步来解决大量连接的问题。PHP是来一个请求就新开一个进程,处理完了之后就进程就结束了,大量连接就需要大量的进程来应对,进程的开启过程和维护进程本身都需要大量的资源,所以PHP这种模型在应对大量请求时比较无奈。 node.js这种模式可以通过CPU绑定,SO_REUSEPORT等选项来提升服务器效率,淘宝的Tengine加入SO_REUSEPORT特性,据他们测试,多进程效率比原来nginx强两倍多。node.js的使用的策略跟nginx是一样的,都是异步多进程模型,nginx还对静态文件做了优化,可以直接通过sendfile()系统调用直接从硬盘发送到网卡(Zero Copy),在理论上,node.js的静态性能是比不过nginx的。

另外建议楼主也去了解下febjs,这个项目本身的代码并不是很优雅,完全是工程的引导的产物,但是他对异步的理解能够拓宽我们的视野,也许node.js这种纯callback的模式不是最好的,即便是generator也不能根本改变这个问题。

server.listen() : 调用OS
    Socket()
    Bind()
    Listen()
    for (;;):
        Accept()
        Fork()       # on('request')
        Read()
        Send()
        Close()
        Exit()

你可以如此理解

@coordcn 多谢,那既然能实现多进程,为什么又把NODEJS称为单进程的??是谬论??

多进程不是天然的,是要自己实现的,默认情况下的确是单进程的,这种情况下服务器稳定性很不好,也不能充分利用多核的性能。 tulayang的代码就解释了PHP运行的模式,nodejs不是这种模式,进程用完是不退出的,一种在做事件循环或者等待事件。

@coordcn

我想,你没看明白。 我写的是底层C语言编写的操作系统Socket握手通信的过程。 任何一种非C语言,最终都是这种模式。 C在底层撑起了Socket核心。

PHP和Nodejs的区别:

PHP 实例 - C socket PHP 实例 - C socket PHP 实例 - C socket

Nodejs实例 - C socket C socket C socket

Nodejs比PHP要节省到Socket建立的内存.

回到顶部