我需要一个允许以不同间隔执行任务的 Nodejs 调度程序 [关闭]
Posted
技术标签:
【中文标题】我需要一个允许以不同间隔执行任务的 Nodejs 调度程序 [关闭]【英文标题】:I need a Nodejs scheduler that allows for tasks at different intervals [closed] 【发布时间】:2013-12-28 06:00:55 【问题描述】:我正在寻找一个节点作业计划,它允许我以不同的时间间隔安排多个任务。例如,
每 30 秒调用一次函数 A 每 60 秒调用一次函数 B 每 7 天调用一次函数 C我还希望能够启动和停止该过程。
到目前为止,我看过:
later - 语法让我很困惑,显然你不能安排超过一个月的任务
agenda- 似乎最有前途,但我对数据库功能感到困惑
timeplan - 太简单了,无法启动和停止
我发现后者的语法令人困惑。
【问题讨论】:
使用 setInterval 怎么样,听起来正是您所追求的? 是的,为什么不使用 setInterval? 我知道其中一些在后台使用 setInterval,但我一直在寻找更高级别的东西......我曾经在 python 中使用 schedule (github.com/dbader/schedule),我是寻找与之类似的节点 试试TaskTimer - github.com/onury/tasktimer 我用了议程,还不错 【参考方案1】:我会推荐node-cron
。它允许使用 Cron 模式运行任务,例如
'* * * * * *' - runs every second
'*/5 * * * * *' - runs every 5 seconds
'10,20,30 * * * * *' - run at 10th, 20th and 30th second of every minute
'0 * * * * *' - runs every minute
'0 0 * * * *' - runs every hour (at 0 minutes and 0 seconds)
还有更多复杂的时间表,例如
'00 30 11 * * 1-5' - Runs every weekday (Monday through Friday) at 11:30:00 AM. It does not run on Saturday or Sunday.
示例代码:每 10 分钟运行一次作业:
var cron = require('cron');
var cronJob = cron.job("0 */10 * * * *", function()
// perform operation e.g. GET request http.get() etc.
console.info('cron job completed');
);
cronJob.start();
您可以在node-cron wiki 中找到更多示例
有关 cron 配置的更多信息可以在 cron wiki 上找到
我在许多项目中都使用过该库,它可以胜任。我希望这会有所帮助。
【讨论】:
好的,我被 cron 语法吓到了,但这似乎是最好的方法 等等,我很快就谈到了,我将如何编写一个每 5 秒或每 30 秒运行一次的 cron? cron 语法可能看起来 可怕。另一方面,它存在很长时间并且广为人知,因此会在 SO 上获得大量支持 刚刚更新了我的回复,所以它将是 - '*/5 * * * * *' - 每 5 秒或 '*/30 * * * * *' 秒 截至 2020 年,根据 node-cron 官方 npm 页面,此包的使用已下降。这个包最后一次发布在 npm 2 年前,因此没有定期更新。现在,应该首选另一个包 node-cron,它显然具有相同的名称但使用不同的 URL。【参考方案2】:我用过node-cron 和agenda。
node-cron 是一个非常简单的库,它提供了像 crontab 一样非常基本且易于理解的 api。它不需要任何配置,就可以工作。
var cronJob = require('cron').CronJob;
var myJob = new cronJob('00 30 11 * * 1-5', function()...);
myJob.start();
议程非常强大,适用于更复杂的服务。想想ifttt,你必须运行数百万个任务。 议程将是最佳选择。
注意:您需要 Mongodb 才能使用 Agenda
var Agenda = require("Agenda");
var agenda = new Agenda(db: address: 'localhost:27017/agenda-example');
agenda.every('*/3 * * * *', 'delete old users');
agenda.start();
【讨论】:
由于某种原因,当我尝试使用 Agenda 时出现错误 ReferenceError: Agenda is not defined。我用 NPM 安装了这个包,在实例化议程之前我需要做些什么吗? 我认为您必须将它要求添加到您的本地变量中。 var Agenda = require("Agenda"); 我最近写了一篇关于议程、项目设置和项目结构的博客评论goo.gl/5sCNBM 请注意,您需要运行 Mongodb 才能使用 Agenda node-cron 或议程是否生成单独的节点系统进程?您可以在多节点进程设置中使用它们吗?【参考方案3】:我认为最好的排名是
1.node-schedule
2.稍后
3.crontab
node-schedule 的示例如下:
var schedule = require("node-schedule");
var rule = new schedule.RecurrenceRule();
//rule.minute = 40;
rule.second = 10;
var jj = schedule.scheduleJob(rule, function()
console.log("execute jj");
);
也许你可以从node modules找到答案。
【讨论】:
喜欢语法,感谢分享【参考方案4】:我编写了一个节点模块,它使用提供声明性接口的持续时间来提供 setInterval 的包装器:
npm 时时刻刻安装
var every = require('every-moment');
var timer = every(5, 'seconds', function()
console.log(this.duration);
);
every(2, 'weeks', function()
console.log(this.duration);
timer.stop();
this.set(1, 'week');
this.start();
);
https://www.npmjs.com/package/every-moment
https://github.com/raygerrard/every-moment
【讨论】:
github链接断开(404) 这很容易阅读。我写了一个使用node-cron
作为@Tom 答案的包。并且有一个很好的语法类似于你的。 reel().call(() => console.log('hello !!')).everyMinute().run()
github.com/shakee93/node-reel
@kekko12 NPM 上有:npmjs.com/package/every-moment
一个月又一个月运行任务该怎么办
要以更长的时间间隔运行某些东西,比如每个月,你需要选择一个使用数据库的包,比如 Agenda。其中大多数将计划保存在内存中,这意味着每个月运行的任务计划只有在进程运行一个月后才会第一次运行。或者,如果您使用绝对时间表(例如“每月的第一天”)并且该进程在那天重新启动,那么它将运行多次。【参考方案5】:
nodeJS 默认
https://nodejs.org/api/timers.html
setInterval(function()
// your function
, 5000);
【讨论】:
【参考方案6】:我为此编写了一个小模块,名为 timexe:
它的代码简单、可靠且没有依赖关系 分辨率以毫秒为单位,并且随着时间的推移具有高精度 类似 Cron,但不兼容(颠倒顺序和其他改进) 我也在浏览器中工作安装:
npm install timexe
使用:
var timexe = require('timexe');
//Every 30 sec
var res1=timexe(”* * * * * /30”, function() console.log(“Its time again”));
//Every minute
var res2=timexe(”* * * * *”,function() console.log(“a minute has passed”));
//Every 7 days
var res3=timexe(”* y/7”,function() console.log(“its the 7th day”));
//Every Wednesdays
var res3=timexe(”* * w3”,function() console.log(“its Wednesdays”));
// Stop "every 30 sec. timer"
timexe.remove(res1.id);
您可以通过直接在 timexe 作业数组中删除/重新添加条目来实现启动/停止功能。但它不是一个 express 函数。
【讨论】:
你应该提到你是作者。 @a20 "为此编写了一个小模块。" 表示他是作者,以防您在阅读时跳过以上是关于我需要一个允许以不同间隔执行任务的 Nodejs 调度程序 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章