当前位置: 首页 > 面试题库 >

Node.JS中的单线程事件循环与多线程非阻塞工作者

巩镜
2023-03-14
问题内容

Node.JS的最大优点是它具有非阻塞性。它是单线程的,因此不需要为每个新的传入连接生成新的线程。

在事件循环(实际上是单线程)的后面,有一个“非阻塞工作程序”。这个东西不再是单线程的,所以(据我了解),它可以为每个任务产生一个新线程。

也许我误会了一些东西,但是优势到底在哪里。如果要处理的任务很多,那么“非阻塞工作”会不会变成“阻塞工作人员”?

谢谢克里斯蒂安


问题答案:

您需要阅读libuv,它是节点的非阻塞I / O背后的“魔术”。

libuv书中最重要的一点是libuv使用主机OS的异步 I / O


设施。 它不只是 为每个连接 创建一个新线程

libuv告诉操作系统,它想知道在一组特定的套接字上发生的任何更改(连接状态,接收到的数据等)。然后由操作系统来处理管理连接。操作系统本身可能会创建一个或多个线程来完成此任务,但这不是我们关心的问题。(它当然不会为每个连接创建一个线程。)

对于其他类型的操作,例如对C库的调用可能在计算上是昂贵的(即加密),libuv提供了可以在其上运行这些操作的 线程池
。由于它是一个线程池,因此您不必再担心线程数不受限制地增长。当池完全繁忙时,操作将排队。

是的,JavaScript在单个线程上运行。是的,节点(通过libuv)在后台产生了许多线程来工作,因此它不需要阻塞JavaScript线程。但是,线程数始终受控制,并且I
/ O通常甚至不会获得其自己的节点分配线程,因为该线程是由OS处理的。



 类似资料:
  • 我有4-5个工作线程处理大型消息队列。我还有另一段代码,它使用2-3个worker运行。我想在处理大型消息队列时阻止所有其他工作者。 我正在使用JDK6和Jms 编辑: 队列进程工作者从未终止。当没有消息时,它们阻塞队列。这些工作者由执行器线程池管理,如果我使用读写锁,其中一个工作者也会被阻塞。此外,如果使用循环屏障,那么我必须终止线程,以便重新传递阻塞的第二个进程。由于工作者是由线程池管理的,所

  • 问题内容: 首先,我开始尝试了解什么是Node.Js。我有两个问题。 第一个问题 从文章费利克斯的,它说:“只能有一个回调在同一时间发射。在此之前,回调完成执行,所有其他的回调都在排队等候”。 然后,考虑以下代码(从nodejs官方网站复制) 如果同时收到两个客户端请求,则意味着以下工作流程: 收到第一个http请求事件,收到第二个请求事件。 收到第一个事件后,将立即执行第一个事件的回调函数。 同

  • 我不是节点程序员,但我对单线程非阻塞IO模型如何工作感兴趣。在我阅读了理解-the-node-js-event-loop这篇文章之后,我对它真的很困惑。它给出了一个模型的例子: QUE:由于只有一个线程,当有两个请求A(先来)和B时,服务器端程序将首先处理请求A:做SQL查询是sleep语句,代表I/O wait。并且程序被堆放在等待中,无法执行在后面呈现web页面的代码。在等待期间程序会切换到请

  • 摘要 本文描述了使用 QEMU 运行 RT-Thread 提供的基于多线程的非阻塞 socket 编程示例。 简介 随着物联网的发展,越来越多产品需要基于网络进行数据传输。在实际开发中,往往要求网络传输时不能阻塞当前线程,以致无法及时处理其他消息。在用户无法直接套用简单的 socket demo 时,RT-Thread 提供基于多线程的非阻塞 socket 编程示例,方便用户进行应用程序开发。 在

  • 我正在使用vert。x 2.1.5版本。我试图在我的项目中使用事件循环。下面给出了示例代码 在此代码中,我的事件总线在执行事件循环之前返回值。我需要根据事件循环输出填充我的输出 如何实现

  • 问题内容: 我不是Node程序员,但我对 单线程无阻塞IO模型的 工作方式感兴趣。在阅读了理解理解节点事件循环文章之后,我对此感到非常困惑。它给出了该模型的示例: 队列: 由于只有一个线程,所以有两个请求A(首先出现)和B(首先出现),服务器端程序将首先处理请求A:执行SQL查询是代表I / O等待的sleeping语句。并且该程序被困在等待中,并且无法执行使网页落后的代码。在等待期间程序会切换到