ruby 是前天的 java 吗?
等哪天大学里面开始教 ruby 不教 java 了再论不迟…
话说十多年前我上大学的时候就有一同学发现了 ruby,然后在自学;现在和当年比,计算机系本科的课程变化很小啊…
node.js 的特色是单线程异步模型。这种模型显而易见的问题就是会造成 callback hell。callback hell 可以靠 CPS 转换、Promise 之类的方法来破;另一个问题就不那么显而易见了,如果执行耗时操作,会导致公平性问题。不过如果你能保证你所有代码都不调用阻塞函数,也不执行 CPU 密集运算,那你倒是可以无视这个问题。
因为 event loop 在处理所有的任务/事件时,都是沿着事件队列顺序执行的,所以在其中任何一个任务/事件本身没有完成之前,其它的回调、监听器、超时、nextTick() 的函数都得不到运行的机会,因为被阻塞的 event loop 根本没机会处理它们,此时程序最好的情况是变慢,最糟的情况是停滞不动,像死掉一样。所以当 Node.js 遇到高 CPU 占用率的任务时,event loop 会被阻塞住
当 Node.js 程序的 event loop 被 CPU 密集型的任务占用,导致有其它任务被阻塞时,却还有 CPU/内核处于闲置的状态,造成资源的浪费。
@billy 为什么 Erlang 比 Node.js 靠谱?因为 Erlang 有轻量级进程,不需要用 CPS 转换之类的怪招去模拟执行多线程。此外更是因为 Erlang 为进程提供了调度器,避免了公平性问题。
说到底 Node.js 只是比较适合 I/O 密集型并发应用。