gpt4 book ai didi

Node.js 事件循环

转载 作者:IT老高 更新时间:2023-10-28 21:56:15 25 4
gpt4 key购买 nike

Node.js I/O 事件循环是单线程还是多线程?

如果我有多个 I/O 进程, Node 会将它们置于外部事件循环中。它们是按顺序处理(最快的优先)还是处理事件循环以同时处理它们(......以及有哪些限制)?

最佳答案

事件循环

Node.js 事件循环在单个线程下运行,这意味着您编写的应用程序代码在单个线程上进行评估。 Nodejs 本身通过 libuv 在底层使用了许多线程,但是在编写 nodejs 代码时您永远不必处理这些线程。

每个涉及 I/O 调用的调用都需要您注册一个回调。此调用也立即返回,这允许您并行执行多个 IO 操作,而无需在应用程序代码中使用线程。一旦 I/O 操作完成,它的回调将被推送到事件循环中。它将在执行之前在事件循环上推送的所有其他回调时立即执行。

有一些方法可以对如何将回调添加到事件循环中进行基本操作。通常你不应该需要这些,但它们有时会很有用。

永远不会有两条真正的并行执行路径,因此所有操作本质上都是线程安全的。通常会有多个异步并发执行路径由事件循环管理。

Read More about the event loop

限制

由于事件循环, Node 不必为每个传入的 tcp 连接启动一个新线程。这允许 Node 服务 hundreds of thousands of requests同时,只要您不计算每个请求的前 1000 个素数。

这也意味着不要进行 CPU 密集型操作很重要,因为这些操作会锁定事件循环并阻止其他异步执行路径继续。不要使用所有 I/O 方法的 sync 变体也很重要,因为这些方法也会锁定事件循环。

如果你想做 CPU 繁重的事情,你应该把它委托(delegate)给一个不同的进程,它可以更有效地执行 CPU 绑定(bind)操作,或者你可以把它写成 node native add on .

Read more about use cases

控制流

为了管理编写许多回调,您可能需要使用控制流库。我相信这是目前最流行的基于回调的库:

我使用过回调,它们几乎把我逼疯了,我使用 Promises 的体验要好得多,bluebird 是一个非常流行且快速的 Promise 库:

我发现这是 Node 社区中一个非常敏感的话题(回调与 promise ),所以无论如何,请使用您认为最适合您个人的方式。一个好的控制流库还应该为您提供异步堆栈跟踪,这对于调试非常重要。

当事件循环中的最后一个回调完成它的执行路径并且不注册任何其他回调时,Node.js 进程将完成。

这不是一个完整的解释,我建议你查看以下线程,它是最新的:

How do I get started with Node.js

关于Node.js 事件循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25568613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com