1.阻塞IO代码示例
echo 'hello';
sleep(5000);
echo 'world';
说明:php中,sleep会阻塞当前所在线程(每当apache接收到一一个请求时都会产生一个php线程去处理当前请求,而node则是采用一个长期运行的进程)
运行结果:
hello 5s后 world
2.非阻塞IO代码示例
console.log('hello');
setTimeout(function() {
console.log('world');
}, 5000);
console.log('bye');
说明:node采用事件轮询机制
运行结果:
hello bye 5s后 world
3.什么是事件轮询?
先注册事件,然后不停的轮询该事件是否已经分发。当事件分发时,对应的回调函数会被触发,然后继续执行下去;未被分发时,先直接执行后面的代码,直到有新事件被触发时再去执行回调函数
4.node并发的实现
采用事件轮询机制,触发一个和文件描述符的通知。当node从浏览器接收到http请求后,底层的tcp连接会分配一个文件描述符,如果浏览器发送数据,则该文件描述符会收到通知,然后触发javascript回调函数
5.node是单进程的
node采用v8引擎,执行函数调用堆栈非常的快,所以可以进行非阻塞IO