内容9.玩转流程10.测试11.产品化1.玩转流程node的单线程只是单线程在js水平。基于V8引擎的单线程,因为V8,前后端js执行模型基本相似,但是node的内核机制仍然是多线程机制,通过libuv调用epoll或者IOCP。也就是说,严格来说node并不是真正的单线程架构。节点内核本身有一定的IO线程和IO线程池。通过libuv的调度,直接在操作系统层面使用多线程。Node开发者可以通过扩展c/c++模块直接操作多线程,提高效率。但是单线程的好处是程序状态单一,不存在锁、线程同步、线程上下文切换等问题。但是单线程程序并不完美。现在很多服务器都有多个CPU和多个CPU内核。一个节点实例只能使用一个CPU核心,那么其他CPU核心不就浪费了吗?而且,单线程的容错能力也很弱。一旦抛出未捕获的异常,整个程序就会崩溃。这样的程序一定很脆弱。这样的服务器端语言有什么价值呢?两个问题:如何让node充分利用多核cpu服务器?如何保证节点进程的健壮性和稳定性?1、服务模型的变化经历了同步(qps为1/n),复制进程(预先分配一定数量的进程,prefork,但是一旦用完,还是和同步服务器一样,qps为m/n),多线程(qps为M*L/N,这种模型,几万并发的时候,内存消耗的问题就会暴露出来,也就是C10k的问题,Apache采用这样的多线程、多进程架构)和事件驱动等几种不同的模型。2.多进程架构面对单进程单线程对多核利用不足的问题,以往的经验都是启动多进程。理想情况下,每个进程使用一个CPU,实现对多核CPU的利用。Node提供了child_process模块??,并提供了child_process.fork()函数来实现进程复制。//nodeworker.jsvarhttp=require('http');http.createServer(function(req,res){res.writeHead(200,{'Content-Type':'text/plain'});res.end('HelloWorld\n');}).listen(Math.round((1+Math.random())*1000),'127.0.0.1');//节点master.jsvarfork=require('child_process').fork;varcpus=require('os').cpus();for(vari=0;i
