如何理解Node.js中 单线程、非阻塞IO、事件驱动

2020-03-26 21:28发布

Node.js中单线程就相当于火车站售票厅只开一个售票窗口,那么所有的人都要通过这个窗口去买票,如果说这些人不排队都争抢这个窗口,可想而知,每一个人想买到票很难,还有一个就是我们经常做公交车,公交车师傅有时候只开前门,这时候很多人都抢着上车,你会发现挤上车特别难,现实生活中,只开一个门或只开一个售票窗口,在程序上看来都是单线程的,此时,就需要引入排队机制,不排队就会产生拥堵,随都做不了事情


生活如此,程序也是如此,不引入排队机制,就会产生阻塞


再回到Node.js,既然它是单线程的,就不能是阻塞的,就像一个人 站在售票口那里,突然发现自己没带钱,然后他就打电话叫别人送点钱过来,而此时这个人依然站在售票口那里,坚决不让出位置让后面的人买票,可想而知,就产生阻塞


现实生活中,如果这个人发现自己没带钱,最好的办法应该是这样做


始终与后面买票人交换一下位置 ,很多黄牛之所以可以快速的帮别人买票就是这样做的,因为黄牛专门有人在售票口那里占位


所谓事件驱动就是,一旦你造成阻塞了,你就靠一边站,等到什么时候不再阻塞,你再通知我,我再把你加入排队当中,再次等待被处理


众所周知,IO都是阻塞的,而Node.js却说自己是非阻塞IO,那么只能说明一点,IO肯定不是由Node.js来处理, Node.js会把IO这项工作分配给别人来做,别人IO完了,再事件通知Node.js,将IO结果重新加入排队,等待被处理


类似的生活案例还有,医院专家门诊看病,做B超相当于IO,做完B超完回来,一般需要重新加入排队;或者在做B超前,医生叮嘱他,你做完B超后就可以拿着B超结果直接找我不必要再重新排队