如果所有node.js的工作线程都忙,会发生什么情况

我尝试了解node.js是如何工作的,尽pipe我已经阅读了这篇文章: 何时使用线程池? 我不知道如果所有工作线程都忙,并且另一个asynchronousI / O操作准备好执行会发生什么。

如果我有这个http://www.future-processing.pl/blog/on-problems-with-threads-in-node-js/文章的权利,事件循环被阻止,直到一个工作线程是免费的照顾一个额外的I / O操作。 这意味着如果五个用户试图同时访问一个网页(比如他们的configuration文件页面可以说需要一个数据库查询),第五个用户将被阻塞,直到第一个数据库查询完成,这个工作线程又是空闲的?

一般情况下,I / O不会阻塞事件循环 (当前有一些例外,比如crypto模块和fs.*Sync()方法),特别是在networkingI / O的情况下,libuv线程池不被使用根本(只对于像dns(当前)和fs操作)。

如果您的数据库驱动程序是用C ++编写的node.js插件,则可能会阻塞事件循环(它正在做一些同步操作),也可能是使用libuv线程池。 但是,如果数据库驱动程序只用JavaScript编写,它通常使用某种networkingI / O,如前所述,它不会阻塞任何内容,也不会使用libuv线程池。

因此,以您的示例为例,根据数据库驱动程序的实现方式,可以一次为所有5个用户提供服务。 例如,在协议级别的MySQL每个连接一次只支持一个未完成的查询。 那么,node.js的大多数MySQL驱动程序将会执行额外的查询,直到当前查询完成。 但是,MySQL驱动程序完全有可能在内部维护某种连接池,以便获得更高的并发性。

但是,如果5个请求中的每个请求都是由磁盘引起的,则第5个请求有可能必须等到其他4个fs请求中的一个完成,这是由于libuv线程池的当前缺省大小。 这并不意味着事件循环本身被阻塞,因为它仍然可以服务新的传入请求和其他事情,但第5个客户端将只需要稍等一会儿。