我最近开始学习 node.js,这是一个基于 V8 的 JavaScript 库,以其非阻塞 IO 和令人难以置信的速度而闻名。
据我了解,节点不会等待 IO 响应,而是运行一个事件循环(类似于游戏循环),不断检查未完成的操作并在 IO 响应后立即继续/完成它们。节点性能与 Apache HTTPD 相比,节点速度明显更快,同时使用更少的内存。
现在,如果您阅读有关 Apache 的信息,您会了解到它每个用户使用 1 个线程,这可能会显着减慢它的速度,这就是我的问题出现的地方:
如果将线程与节点在其事件循环中内部执行的操作进行比较,您会开始看到相似之处:两者都是等待资源响应的未完成进程的抽象,都检查操作是否定期进行,然后不占用CPU 一段时间(至少我认为一个好的阻塞 API 在重新检查之前会休眠几毫秒)。
现在,使线程变得如此糟糕的显着关键差异在哪里?