【问题标题】:Infinite execution of tasks for nodejs application无限执行nodejs应用程序的任务
【发布时间】:2013-03-30 22:44:57
【问题描述】:

假设我有这样的代码

function execute() {
    var tasks = buildListOfTasks();
    // ...
}

buildListOfTask 创建函数数组。函数是异步的,可能会发出 HTTP 请求或/和执行数据库操作。

如果任务列表显示为空或所有任务都已执行,我需要再次重复相同的execute 例程。再说一次,说“无限循环”。所以,它是一个类似于应用程序的守护进程。

我完全可以理解如何在同步世界中实现这一点,但有点困惑如何在 node.js 异步世界中实现它。

【问题讨论】:

  • 有用的链接,也许是github.com/creationix/step
  • 使用 jQuery 的延迟对象思想。我认为甚至有一个 Javascript 库可以模仿这个
  • @AlexWayne 是的,它有帮助,但不完全。我熟悉这样的库(个人使用异步)。我有点困惑如何“循环”操作。
  • setTimeout 有什么问题?o_O
  • 是 function execute() { var tasks = buildListOfTasks(); if(tasks.length ===0) {return setTimeout(execute,100)} /***/}

标签: javascript node.js io


【解决方案1】:

使用async.js,它是队列对象。

function runTask(task, callback) {
    //dispatch a single asynchronous task to do some real work
    task(callback);
}
//the 10 means allow up to 10 in parallel, then start queueing
var queue = async.queue(runTask, 10);

//Check for work to do and enqueue it
function refillQueue() {
  buildListOfTasks().forEach(function (task) {
    queue.push(task);
  });
}    

//queue will call this whenever all pending work is completed
//so wait 100ms and check again for more arriving work
queue.drain = function() {
  setTimeout(refillQueue, 100);
};

//start things off initially
refillQueue();

【讨论】:

  • 看起来真的很接近我的需要..会尝试!
【解决方案2】:

如果您已经熟悉 async 之类的库,可以使用 execute() 作为最终回调来重新启动任务:

function execute(err) {
    if (!err) {
        async.series(buildListOfTasks(), execute);
    } else {
        // ...
    }
}

【讨论】:

  • 这样的代码有可能得到stackoverflow异常吗?
  • 对这些异步调用进行处理,即使执行将被多次调用,堆栈在每次异步回调时都会重置,因此您不会溢出它。
  • 但是,您需要实际查看 err 参数,而不是在引发错误时盲目地在紧密循环中继续触发 async.series。
【解决方案3】:

我认为你必须使用 async.js,可能是并行函数。 https://github.com/caolan/async#parallel

在全局回调中,只需调用execute进行递归调用。

async.parallel(tasks,
    function(err, results){
        if(!err) execute();
    }
);

【讨论】:

  • 队列比这更安全一些,因为有最大并发限制。例如,如果对 buildListOfTasks 的调用返回 800 个数据库查询,这可能会使您的数据库崩溃。
猜你喜欢
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
  • 2015-02-14
  • 2015-08-16
  • 1970-01-01
相关资源
最近更新 更多