nodejs单线程 非阻塞I/O 事件驱动
java、php语言中,与每一个客户端的连接,都创建一个线程,每个线程耗费2MB左右的内存
node仅仅使用一个线程,通过非阻塞I/O 事件驱动,让nodejs宏观上并行
demo.js
var fs = require('fs')
/**
* Q: 什么是非阻塞IO?
* A: 非阻塞IO的目的是高并发,非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
*
*/
console.log(1)
fs.readFile('mock.json', 'utf8', (err,data) => {
if (err) {
console.log(err)
return
}
console.log(2)
console.log(data)
console.log(3)
})
console.log(4)
// 打印顺序 1 4 2 data 3
demo2.js
下面代码打印的结果是undefined
var fs = require('fs')
function getData () {
fs.readFile('mock.json', 'utf8', (err,data) => {
if (err) {
console.log(err)
return
}
return data
})
}
console.log(getData())
- 回调函数处理异步
demo2.js
var fs = require('fs')
function getData (callback) {
fs.readFile('mock.json', 'utf8', (err,data) => {
if (err) {
console.log(err)
return
}
// return data
callback(data)
})
}
getData(function(data){
console.log(data)
})
- events模块处理异步
demo3.js
var fs = require('fs')
var events = require('events')
var EventEmitter = new events.EventEmitter()
// 监听
EventEmitter.on('send', (data)=>{
console.log(data)
})
function getData () {
fs.readFile('mock.json', 'utf8', (err,data) => {
if (err) {
console.log(err)
return
}
// 发送数据
EventEmitter.emit('send', data)
})
}
getData()
// console.log(events)
补充
举个栗子:
早晨起床,大喊一声,今天又是元气满满的一天!
这时候,妈妈问你
"宝贝,饿了吗?"
这时候的你像一个哑巴一样,啥也没说,妈妈在心中默念,亲生的--亲生的--亲生的--
不知过了多久,妈妈又问你
“宝贝,饿了吗?”如果就目前为止来看的话,你确实是个哑巴
世界上最爱的你的人,还是你的妈妈呀,
"宝贝,饿了吗?"
“饿了”终于,铁棒成针,水滴石穿。
"知道厨房在哪吧?饿了就快点做饭,我早就饿了"。你妈妈最终还是你妈妈
非阻塞I/O
"宝贝饿了吗?"
妈妈问完,就出去打麻将了,过了许久,你感觉饿了,,给妈妈打了个电话
"妈妈,我饿了"
“吃!胡了!哎,好勒,忙着呢,你自己吃点吧”
嘟嘟嘟嘟……
异步I/O
众所周知,非阻塞IO、阻塞IO等都是同步IO,真正意义上的异步IO只有异步I/O模型
网友评论