我尝试了解node.js的工作原理,尽管我已阅读本文:何时使用线程池?我不确定所有工作线程都忙并且准备好执行另一个异步I / O操作时会发生什么。
如果我正确理解了这篇http://www.future-processing.pl/blog/on-problems-with-threads-in-node-js/文章,则事件循环将被阻塞,直到工作线程可以自由处理附加的I / O操作。这意味着如果五个用户尝试同时访问一个网页(例如,他们的个人资料页面要求进行db查询),则第5个用户将被阻止,直到完成第一个db查询并且该工作线程再次空闲为止?
I / O通常不会阻塞事件循环(当前存在一些异常,例如crypto
模块和fs.*Sync()
方法之类的东西),尤其是在网络I / O的情况下,根本不使用libuv线程池(仅适用于诸如dns(当前)和fs操作)。
如果您的数据库驱动程序是用C ++编写的node.js插件,则可能会阻塞事件循环(正在做同步操作)或正在使用libuv线程池。但是,如果数据库驱动程序仅用JavaScript编写,则它通常会使用某种网络I / O,如前所述,它不会阻止任何内容,也不会使用libuv线程池。
因此,在您的示例中,根据数据库驱动程序的实现方式,可以一次为所有5个用户提供服务。例如,协议级别的MySQL每个连接一次仅支持一个未完成的查询。因此,大多数用于node.js的MySQL驱动程序将做的工作是将其他查询排队,直到当前查询完成为止。但是,MySQL驱动程序完全有可能在内部维护某种连接池,以便具有更大的并发性。
但是,如果5个请求中的每一个都导致磁盘有问题,那么由于libuv线程池的当前默认大小,第5个请求可能不得不等待其他4个fs请求之一完成。这并不意味着事件循环本身会被阻塞,因为它仍然可以处理新的传入请求和其他内容,但是第5个客户端将只需要等待更长的时间。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句