Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 用于回调中的循环。舞台调度? //定义架构、模型、数据库连接等。。 http.createServer(函数(req,res){ //一些无关的东西。。 Model.find({name:regex}).exec(函数(err,results){ var localArray=[]; 对于(变量i=0,len=results.length;i_Node.js_Mongoose - Fatal编程技术网

Node.js 用于回调中的循环。舞台调度? //定义架构、模型、数据库连接等。。 http.createServer(函数(req,res){ //一些无关的东西。。 Model.find({name:regex}).exec(函数(err,results){ var localArray=[]; 对于(变量i=0,len=results.length;i

Node.js 用于回调中的循环。舞台调度? //定义架构、模型、数据库连接等。。 http.createServer(函数(req,res){ //一些无关的东西。。 Model.find({name:regex}).exec(函数(err,results){ var localArray=[]; 对于(变量i=0,len=results.length;i,node.js,mongoose,Node.js,Mongoose,我的回调有一个for循环,它可能很长(results.length有时为100) 我写过阻塞代码吗?如果是,我怎样才能使它不阻塞?长话短说,答案是肯定的,它是阻塞。此循环运行时收到的任何请求都将排队。使用子进程解锁父代码。它要求您的机器是多核的(不是生成进程,而是高效的) 长话短说: JavaScript(以及节点)是单线程的。在这个问题的上下文中它意味着什么——当您的循环运行时,不能调用其他函数。 解除阻止它的唯一方法是使用子进程。你有两个选择,每个都有自己的优点和缺点 运行集群,这样当一个节

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


我写过阻塞代码吗?如果是,我怎样才能使它不阻塞?

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

长话短说:

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

  • 运行集群,这样当一个节点进程被“阻止”时,您就有另一个进程来服务传入的请求
  • 生成一个子进程来为您运行一些繁重的任务,然后将结果报告回来
  • 第一个选项非常简单,需要将服务器包装到集群中 然而,您可能会在每个节点进程中运行此循环,从而“阻塞”整个集群

    第二种方案实施起来更复杂,需要更多的资源。但是,当你不得不做一些非常繁重的事情和/或潜在的内存泄漏时,这是令人惊讶的。这允许您创建一个单独的节点进程(这将需要一些RAM,并且需要几毫秒才能启动,所以您无法生成数百万这样的家伙),向它传递一些参数,然后等待结果。您的父进程将能够为即将到来的请求提供服务。但别忘了在完成子进程后杀死它

    无论您选择什么,请注意,您仍然在同一台机器上运行,您遇到的下一个瓶颈是您的机器资源。无论如何,运行一些基准测试。对一百个项目的迭代并不会产生一个子项目,但是如果你迭代数千个或更多的项目呢

    p、 美国的反向循环运行得更快:

    //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);
    

    它是循环阻塞,但不阻塞I/O。如果您需要它,也可以。100个项目并不足以困扰循环或JS。感谢您的快速回复。:)您缺少响应。json(localArray);:)res.json()不是Express的一部分吗?
    for (var i = results.length; i > 0; i--) {
      //Do something
    };