【问题标题】:Run continuous Background Job with Node JS使用 Node JS 运行连续的后台作业
【发布时间】:2013-10-21 08:45:34
【问题描述】:

考虑有一个任务 A 和其他 n 个任务。我想与其他 n 个任务并行运行一个任务 A。任务 A 只是每 5 秒从队列中获取数据。

我是 Node JS 的新手。有什么方法可以在后台运行这个任务/作业 A 或者有什么解决方案吗??

【问题讨论】:

  • 是的,当然有。在不知道您要做什么的情况下,不确定如何为您提供更多信息。定义“后台工作”......您的意思是在系统级别,还是在您的应用程序中?
  • 实际上在单个 NodeJS 进程中是不可能的,因为 NodeJS 是单线程的,即根本没有并行性。
  • 我同意@Brad 的观点,有很多方法可以让事情并行发生,我认为问题中没有足够的信息来提出经过深思熟虑的建议。您会根据任务是本地还是远程、是否相互依赖、是否必须在不同服务器之间进行平衡等采取不同的方法。您要做什么?
  • @freakish 这并不完全准确。您的 JavaScript 只有一个线程,但其他线程用于 IO 等等。不过没关系,没有任何其他信息,就无法知道他要做什么,以及是否需要额外的线程。
  • 嗨,这就是我想要做的......我有两种方法,比如 X 和 Y,这两种方法都将一些数据推送到队列中。方法 X 和 Y 被调用 20 次,如 X()、Y()、X()、Y()....等等。在执行这些方法的同时,我想定期从队列中检索数据并对数据执行一些操作。

标签: javascript node.js


【解决方案1】:

很大程度上取决于任务是什么。如果我理解您的问题,您可以通过两种方式执行此操作:1,使用计时器运行函数,以及 2,生成子进程。

1

function taskA(){...}

setInterval(taskA,5000);

2

//same code as 1, but in a child process
var spawn = require('child_process').spawn,
ls    = spawn('taskA.js');
//taskA.js has the code from example 1

如果您在主进程中做很多其他事情,您可能更喜欢 2 比 1,因为节点是单线程的。还应该注意的是,在某些情况下可能有更好的方法来做到这一点。例如,在基于云的 webapp 中,我可能依赖 PAAS 的服务来运行后台任务。您可能还想查看https://github.com/nodejitsu/forever-monitor

这是一篇关于如何在 web 应用中处理后台作业的精彩文章。 https://devcenter.heroku.com/articles/background-jobs-queueing 但是,它不是特定于节点的。它也特定于 Heroku 平台。

【讨论】:

  • 非常感谢..!早些时候我只使用 setInterval。但是 setInterval 代码必须先等待 n 个任务完成才能轮到它。产生一个进程并运行 setInterval 似乎是正确的方法。 node 中 spawn 和 fork 到底有什么区别?
  • 这里的答案很好:stackoverflow.com/questions/17861362/…。您介意将其标记为正确吗?
  • 这不是在浏览器中运行,所以这显然不是一个解决方案。程序将调用 setInterval (或 setTimeout,如果你使用它),然后从末尾掉下来并终止。
  • @RickO'Shea,感谢您的评论。这不是我所经历的行为。如果我创建一个带有setInterval(() => {}, 1000); 的节点脚本,它永远不会结束进程,直到我杀死它。我相信计时器、打开的连接等可以保持进程运行。
【解决方案2】:

您可以使用标准的setTimeout() 方法。

function task() {
  console.log("Timer");
  setTimeout(task, 5000);
}

task();

【讨论】:

  • 同样,除非您处于持续运行的后台功能中,否则这将不起作用。
【解决方案3】:

看看Kue - https://github.com/LearnBoost/kue 这是一个易于使用的节点消息队列系统。基本上,您将拥有一个将事物放入队列的节点程序,以及处理队列的其他进程。

因此,任务 A 将每 5 秒运行一次(如果您愿意,可以使用 cron 或其他系统)。它会查看队列并处理相关项目。其他 n 个工作人员将共享 Kue 的配置,但只会推送事件。

【讨论】:

    猜你喜欢
    • 2013-07-22
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多