共享状态的并发
Node采用的是一个长期运行的进程,即单线程;而Apache则会产生多线程每次都会刷新状态。当解释器再次执行时,改变状态的函数虽然再次调用了,但是对作用域中的变量不加影响。
阻塞和非阻塞的并发
Node采用了事件轮询。
setTimeout不是阻塞的,只是注册了一个事件然后异步执行代码。包括Http和net这样的原生模块中的I/O也是采用了事件轮询。但由于回调函数的执行需要很长一段时间(循环次数多),所以并不严格遵守时钟。
v8调用函数会创建一个堆栈,称为执行堆栈或者调用堆栈。当HTTP请求到达服务器时,node会发布一个通知,这时候会执行函数和它的回调函数。v8虽然是单线程处理事件的,但是它的调用堆栈执行的十分快,因此在同一时刻可以只处理一个请求。
错误处理机制
Node每一个回调函数的错误都会影响整个进程导致奔溃,所以一定要注意错误处理。
uncatchException
process.on('uncaughtExpection',function(err){
console.error(err)
process.exit(1)
})
htto、net中error的分发
var net=require('net')
net.createServer(function(connection){
connection.on('error',function(err){})
}).listen(400)
异步API对error的处理
var fs=require('fs')
fs.readfile('./address',function(err,data){
if(err) return console.error(err)
})
堆栈处理
node不能追踪到未来的错误,也不能追踪发生了错误后的错误(上下文丢失),所以每一步都要对错误进行处理。