Pre*_*ree 2 event-loop node.js libuv
我正在学习 Node Js,我理解 node js 的核心是基于事件循环的反应器模式。
当任何事件发生时,它会进入事件队列,然后在运行任务结束后被堆栈拾取,如果事件是非阻塞事件,则会发生这种情况,但如果它是阻塞请求,则事件循环将其传递给来自 libuv 线程池的线程。
现在我的疑问是:
一旦执行结束,libuv 线程是否将请求传递回事件队列或事件循环?,不同的教程有不同的场景。
libuv 中的线程池还有 3 个线程,现在假设 10 个用户尝试同时登录每个人(某些应用程序,例如 facebook 等),仅如何,并且线程在他们想连接到数据库时被阻塞,那么如何仅三个线程会处理这么多负载吗?
我真的很困惑,在任何地方都没有得到对这些疑问的很好解释,任何帮助将不胜感激。
当任何事件发生时,它会进入事件队列,然后被堆栈拾取
事件不会被堆栈拾取。它通过事件循环传递给调用堆栈。
如果它是一个阻塞请求,则事件循环将它传递给 libuv 线程池中的一个线程。
只有四种使用线程池的东西 - DNS 查找、fs、crypto 和 zlib。无论是否阻塞,其他所有内容都在主线程中执行。
所以日志记录是一个网络请求,线程池不处理这个。libuv 和 node 都没有任何代码来处理与网络请求相关的这种低级操作。相反,libuv 将请求委托给底层操作系统,然后它只是等待操作系统发出一个信号,表明某些响应已经返回到请求。操作系统跟踪网络堆栈中的连接。但是网络 i/o 是由您的网络硬件和您的 ISP 处理的。
小智 2
一旦执行结束,libuv 线程会将请求传递回事件队列或事件循环吗?
从 Node.js 的角度来看,这有什么不同吗?
2) libuv 中的线程池多了 3 个线程,现在假设 10 个用户尝试登录,每个人同时登录(像 facebook 等一些应用程序),只有这样,线程在想要连接到数据库时被阻止,所以怎么只有三个线程就能处理这么大的负载?
libuv 使用威胁池,但不是以“天真的”方式。大多数异步请求是文件系统/tcp 交互,通过select(). 仅当您创建自定义 C++ 模块并手动分派 CPU/IO 阻塞任务时,才需要担心线程池。
| 归档时间: |
|
| 查看次数: |
1718 次 |
| 最近记录: |