如何理解Node.js的单线程
2个回答
2017-11-25 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:117538
获赞数:517174
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。
向TA提问 私信TA
关注
展开全部
Node.js中单线程就相当于火车站售票厅只开一个售票窗口,那么所有的人都要通过这个窗口去买票,如果说这些人不排队都争抢这个窗口,可想而知,每一个人想买到票很难,还有一个就是我们经常做公交车,公交车师傅有时候只开前门,这时候很多人都抢着上车,你会发现挤上车特别难,现实生活中,只开一个门或只开一个售票窗口,在程序上看来都是单线程的,此时,就需要引入排队机制,不排队就会产生拥堵,随都做不了事情
生活如此,程序也是如此,不引入排队机制,就会产生阻塞
再回到Node.js,既然它是单线程的,就不能是阻塞的,就像一个人 站在售票口那里,突然发现自己没带钱,然后他就打电话叫别人送点钱过来,而此时这个人依然站在售票口那里,坚决不让出位置让后面的人买票,可想而知,就产生阻塞
现实生活中,如果这个人发现自己没带钱,最好的办法应该是这样做
始终与后面买票人交换一下位置 ,很多黄牛之所以可以快速的帮别人买票就是这样做的,因为黄牛专门有人在售票口那里占位
所谓事件驱动就是,一旦你造成阻塞了,你就靠一边站,等到什么时候不再阻塞,你再通知我,我再把你加入排队当中,再次等待被处理
众所周知,IO都是阻塞的,而Node.js却说自己是非阻塞IO,那么只能说明一点,IO肯定不是由Node.js来处理, Node.js会把IO这项工作分配给别人来做,别人IO完了,再事件通知Node.js,将IO结果重新加入排队,等待被处理
类似的生活案例还有,医院专家门诊看病,做B超相当于IO,做完B超完回来,一般需要重新加入排队;或者在做B超前,医生叮嘱他,你做完B超后就可以拿着B超结果直接找我不必要再重新排队
生活如此,程序也是如此,不引入排队机制,就会产生阻塞
再回到Node.js,既然它是单线程的,就不能是阻塞的,就像一个人 站在售票口那里,突然发现自己没带钱,然后他就打电话叫别人送点钱过来,而此时这个人依然站在售票口那里,坚决不让出位置让后面的人买票,可想而知,就产生阻塞
现实生活中,如果这个人发现自己没带钱,最好的办法应该是这样做
始终与后面买票人交换一下位置 ,很多黄牛之所以可以快速的帮别人买票就是这样做的,因为黄牛专门有人在售票口那里占位
所谓事件驱动就是,一旦你造成阻塞了,你就靠一边站,等到什么时候不再阻塞,你再通知我,我再把你加入排队当中,再次等待被处理
众所周知,IO都是阻塞的,而Node.js却说自己是非阻塞IO,那么只能说明一点,IO肯定不是由Node.js来处理, Node.js会把IO这项工作分配给别人来做,别人IO完了,再事件通知Node.js,将IO结果重新加入排队,等待被处理
类似的生活案例还有,医院专家门诊看病,做B超相当于IO,做完B超完回来,一般需要重新加入排队;或者在做B超前,医生叮嘱他,你做完B超后就可以拿着B超结果直接找我不必要再重新排队
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询