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

时间:2015-06-15 11:53:40

标签: javascript node.js multithreading

我试着理解node.js是如何工作的,虽然我已经读过这篇文章:When is the thread pool used?我不确定如果所有工作线程都忙,并且另一个异步I / O操作准备好执行会发生什么。

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

2 个答案:

答案 0 :(得分:3)

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个请求中的每个请求都导致某些内容来自磁盘,那么第5个请求可能必须等到其他4个fs请求之一完成,因为当前的默认大小是libuv线程池。这并不意味着事件循环本身被阻止,因为它仍然可以服务新的传入请求和其他东西,但第五个客户端只需要等待一段时间。

答案 1 :(得分:0)

  

是否有任何类型的队列用于在工作线程中执行的操作?

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