和其他多线程语言进行对比
类比:
从前,小镇上有两家餐馆,一家老板聘用了很多服务员,而另一家的老板只聘用了一位服务员。
所以,自然而然就会出现以下的画面:
如果餐馆都来了4位客人
拥有多名服务员的餐馆
四名服务员分别服务一位客人。
只拥有一名服务员的餐馆
唯一的服务员在四位客人之间穿梭。
分析:
上面的例子中:
所以我们可以看出两家餐馆的处理事件的方式:
我们称第一家餐馆书里事件的方式为多线程,第二家餐馆处理事件的方式为单线程
我们理解为在第一家餐馆的处事原则中,他一个线程只处理一个事件,
第二家餐馆的处事原则是一个线程同时处理了多个事件。
事件我们简单地认为就是 计算 和 io操作。
第一家每一个服务员在服务自己的客人的时候,在客人进行点餐的时候(理解为计算),就在那里等着,不进行任何操作,因为他也没有别的人需要服务。
而第二家服务员在自己的客人点餐(理解为计算)的时候,还可以帮助别的客人结账(理解为 io 操作)。
可以看出第一家餐馆的服务员利用效率较低,而第二家的服务员被当做老黄牛来使用,效率极高。
回归到计算机:
在 CPU 发出 io 命令之后,磁盘开始读取数据,但如果读取的数据比较多的时候, CPU就晾在一边什么都不干了,这样就极大地浪费了 CPU ,它本来可以在磁盘正在操作别的事情的时候,进行一些计算之类的操作,而不是死等闲着。
所以 nodejs 的操作就是让一个服务员极限操作,不能让他闲下来,他得在各种事务之间不停操作,这样可以让他的效率达到接近100%,这就是 nodejs 的哲学。
坏处:
nodejs 把一个服务员当老黄牛来使用,万一他生病了,整条业务都停掉了,而多线程就不会出现这种问题。