请问大佬们,都说nodejs是单线程的?
发布于 6 年前 作者 1316346949 7404 次浏览 来自 问答

如果A用户和B用户同时请求了服务器,服务器处理每个请求需要10s才能返回给用户, ①:如果nodejs是单线程的,使用异步,将10s的查询结果插入到event loop里,怎么原路返回给用户?res.end()也是使用libuv利用事件函数操作了系统线程返回到对应的用户的机器的吗? ②:js没有io操作能力,利用了libuv进行io操作?,都是js单线程,性能高因为不用应对每个用户请求创建新线程,线程创建和销毁造成资源浪费?但是nodejs底层的libuv是多线程的线程池用来并行io操作?如果是的话,那么libuv多线程创建,销毁不会对资源造成浪费吗?如果页造成浪费,那么在js胶水语言层的单线程又能减少多少系统资源呢?

以上都是小弟迷惑的地方,请了解详情的大佬指点一二。感谢ing

6 回复

一个一个回答:

  1. 怎么原路返回给用户? 每次请求都是一个闭包,能把所有参数包括进行,所以 event loop 只放了一个函数指针,io 处理完成后,换起 js ,然后运行。

  2. res.end()也是使用libuv利用事件函数操作了系统线程返回到对应的用户的机器的吗? 是的,是这样的。

  3. js没有io操作能力,利用了libuv进行io操作? js 的语言上没有 io 操作能力,在最早的时间上,都没有二进制的处理能力。

  4. 都是js单线程,性能高因为不用应对每个用户请求创建新线程,线程创建和销毁造成资源浪费? 不会每个用户都创建新的线程。

  5. 但是nodejs底层的libuv是多线程的线程池用来并行io操作? 是的。

  6. 如果是的话,那么libuv多线程创建,销毁不会对资源造成浪费吗? libuv 是一个线程池,用的多会新建,用的少会不建。

  7. 如果页造成浪费,那么在js胶水语言层的单线程又能减少多少系统资源呢? 关键是怎么看,每次请求都是一个函数,相对于系统级的调用,是减少了资源

可以看看我写的文章:nodejs中异步,希望对你有用。

@htoooth 谢谢大佬的详细解答。理解了一些东西,还有一个问题就是js层面是单线程+event loop来代替多线程。libuv是线程池,面对大量访问时要创建线程,面对用户量访问变少时会销毁多余的空闲线程,这样的创建销毁和java的多线程应对并发的创建销毁理论上是一致的吗?如果是一致的那么异步指的只是js胶水层的异步,底层还是同步的?和java多线程原理一样吗?如果是的那么高io性能在哪里被提高了呢?

@htoooth 刚才小弟去看了您的文章,干货很多

@1316346949 nodejs 文件是多线程的,而网络是 epoll,一般情况下 nodejs 是默认起了四个线程,这四个线程主要是用来读写文件,压缩,加密来用的。 image.png

node.js 只是起任务分配, 调度工作. 其他的资源操作并不是由 node.js 直接完成的.

nodejs底层的libuv是多线程的线程池用来并行io操作 记住就是这句话

回到顶部