Node.js学习日记(二):阻塞与非阻塞

178 阅读1分钟

共享状态的并发

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不能追踪到未来的错误,也不能追踪发生了错误后的错误(上下文丢失),所以每一步都要对错误进行处理。