繁体   English   中英

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

[英]What happens if all node.js's worker threads are busy

我试着理解node.js是如何工作的,尽管我读过这篇文章: 什么时候使用线程池? 我不确定如果所有工作线程都忙,并且另一个异步I / O操作准备好执行会发生什么。

如果我正确地获得了http://www.future-processing.pl/blog/on-problems-with-threads-in-node-js/文章,那么事件循环将被阻止,直到工作线程可以自由处理额外的I / O操作。 这意味着如果五个用户同时尝试访问网页(比如他们的个人资料页面,可以说需要db查询),第五个用户将被阻止,直到第一个db-query完成并且此工作线程再次空闲?

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请求之一完成。 这并不意味着事件循环本身被阻止,因为它仍然可以服务新的传入请求和其他东西,但第五个客户端将只需要等待一段时间。

是否存在在工作线程中执行的任何操作队列?

是。 libuv管理此队列。 所有工作线程都可能被占用,在这种情况下,进入工作池的新异步请求将无法进行。 请注意,“异步FS请求”仍必须在某处完成,并将阻止正在处理它的工作线程,直到完成为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM