gpt4 book ai didi

node.js - 回调中的for循环。封锁?

转载 作者:搜寻专家 更新时间:2023-11-01 00:44:53 29 4
gpt4 key购买 nike

//defining schemas, models, db connections, etc..

http.createServer(function (req, res) {
// some irrelevant stuff..

Model.find({name : regex}).exec(function (err, results) {

var localArray = [];

for (var i = 0, len = results.length; i < len; ++i) {
localArray.push(results[i].name);
localArray.push(results[i].id);
}; // is this for loop blocking?

// some more irrelevant stuff..
});
}).listen(8080);

我的回调有一个 for 循环,它可能很长(有时 results.length = 100)。

我是否编写了阻塞代码?如果是,我怎样才能让它成为非阻塞的?

最佳答案

长话短说,答案是肯定的,就是阻塞。在此循环运行期间收到的任何请求都将排队。使用子进程解锁您的父代码。它要求您的机器是多核的(不是生成进程而是高效)。

长话短说:

JavaScript(以及 Node)是单线程的。这在这个问题的上下文中意味着什么——当你的循环运行时,不能调用其他函数。解锁它的唯一方法是使用子进程。您有两种选择,每种都有自己的长处和缺点。

  1. 运行一个集群,这样当一个 Node 进程被“阻塞”时,您有另一个进程来处理传入的请求。
  2. 生成一个子进程来为您运行繁重的任务,然后报告结果。

第一个选项非常简单,需要您将服务器包装在集群中 http://nodejs.org/api/cluster.html然而,您可能会“阻塞”整个集群,因为在每个 Node 进程中运行此循环。

第二个选项实现起来更复杂,需要更多资源。但是,当您必须做一些非常繁重和/或可能会泄漏内存的事情时,这真是太神奇了。这允许你做的是创建一个单独的 Node 进程(这将需要一些 RAM 并需要几毫秒才能启动,所以你不能产生数百万个这样的家伙),向它传递一些参数并等待结果到来。您的父进程将能够处理即将到来的请求。但是不要忘记在完成后杀死子进程。 http://nodejs.org/api/child_process.html

无论您选择什么,请注意您仍在同一台机器上运行,您遇到的下一个瓶颈是您的机器资源。无论如何运行一些基准测试。迭代一百个项目并没有那么重来产生一个 child ,但是如果你迭代数千个或更多?......

附注反向循环运行得更快:

for (var i = results.length; i > 0; i--) {
//Do something
};

关于node.js - 回调中的for循环。封锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22002047/

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