我是node.js的新手。我目前正在阅读这本名为'Beignning Node.js'由Basarat Ali Syed。Node.js单线程VS Tranditonal网络服务器线程池
下面是从中摘录其中指出传统的Web服务器的线程池的缺点:使用线程池这个 方法在几年前,许多延用至今
大多数Web服务器。但是,这种方法不是没有缺点。在线程之间再次浪费RAM 。此外,操作系统需要在线程 (即使它们处于空闲状态)之间进行上下文切换,这会导致浪费CPU资源。
我不太明白为什么在线程池内的线程之间有上下文切换。据我所知,一个线程将在任务期间持续。一旦任务完成,线程将自由接收下一个任务。
所以我的Q1:为什么需要上下文切换?线程之间的上下文切换何时发生?
我的Q2:为什么node.js不使用多个线程来处理事件队列中的事件?它不是更有效率,并减少事件的排队时间?
谢谢,slebetman,为您提供如此全面的答案。它确实有帮助。现在我可以理解人们为什么说node.js不能运行CPU消耗任务。这是因为node.js只有一个线程。没有上下文切换,它必须等待该任务在能够执行下一个任务之前完全查询。 –
但是这对多线程系统来说不成问题。因为操作系统可以轻松地分配一定的时间来运行任务。如果其他紧急任务到来,OS可以执行上下文切换。紧急任务完成后,可以再次恢复前一个任务,而不会产生任何头痛。 –
@ ShaohuaHuang:这里的关键洞察是上下文切换并不便宜。在事件循环中管理任务的单线程流程可轻松击败依赖于操作系统来管理任务的多线程流程。最惊人的例子之一是tclhttpd在21世纪初击败了Apache。 Tclhttpd是用一种非常慢的编程语言Tcl编写的,而Apache是用C编写的。然而Apache在服务静态文件方面速度较慢。关键的区别是Apache是多线程的,但tclhttpd是非阻塞的,单线程的。 – slebetman