Мне нужен планировщик Nodejs, который позволяет выполнять задачи с разными интервалами [закрыто]


127

Я ищу расписание работы узла, которое позволит мне запланировать ряд задач с разными интервалами. Например,

  • вызывать функцию A каждые 30 секунд
  • вызывать функцию B каждые 60 секунд
  • вызывать функцию C каждые 7 дней

Я также хочу иметь возможность запускать и останавливать процесс.

До сих пор я смотрел на:

  • позже - меня смущает синтаксис, также, видимо, вы не можете планировать задачи дольше месяца

  • повестка дня - кажется наиболее многообещающей, однако меня смущает функциональность базы данных

  • временной план - слишком простой, нельзя запускать и останавливать

Я считаю синтаксис последнего запутанным.


1
Как насчет того, чтобы просто использовать setInterval, звучит как то, что вам нужно?
adeneo

Да почему бы не использовать setInterval?
Яламбер

Я знаю, что под капотом некоторые из них используют setInterval, но я искал что-то более высокий уровень ... Я использовал расписание ( github.com/dbader/schedule ) в python, и я искал узел аналог тому
user379468

Попробуйте TaskTimer - github.com/onury/tasktimer
Онур Йылдырым

Повестку использовал, неплохо
Александр Головатый

Ответы:


223

Я бы рекомендовал 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

Подробнее о конфигурации cron можно найти в cron wiki

Я использовал эту библиотеку во многих проектах, и она выполняет свою работу. Надеюсь, это поможет.


хорошо, меня
напугал

1
подождите, я скоро поговорил, как мне написать cron, который запускается каждые 5 или 30 секунд?
user379468

3
Синтаксис cron может выглядеть устрашающе . С другой стороны, он существует уже давно и широко известен, поэтому получит большую поддержку на SO
Том

1
Только что обновил свой ответ, так что он будет - '* / 5 * * * * *' - каждые 5 секунд или '* / 30 * * * * *' секунд
Том

1
По состоянию на 2020 год и согласно официальной странице npm node-cron , использование этого пакета сократилось. Последний раз этот пакет публиковался в npm 2 года назад, поэтому не обновляется регулярно. Теперь предпочтительнее использовать другой пакет node-cron с таким же именем, но с другим URL-адресом.
n0noob

36

Я использовал node-cron и повестку дня .

node-cron - очень простая библиотека, которая предоставляет очень простой и понятный API, например crontab. Он не требует настройки и просто работает.

var cronJob = require('cron').CronJob;
var myJob = new cronJob('00 30 11 * * 1-5', function(){...});
myJob.start();

Программа очень мощная и подходит для гораздо более сложных услуг. Подумайте об ifttt , вам нужно выполнить миллионы задач. повестка дня была бы лучшим выбором.

Примечание. Для использования Agenda вам потребуется Mongodb.

var Agenda = require("Agenda");
var agenda = new Agenda({db: { address: 'localhost:27017/agenda-example'}});
agenda.every('*/3 * * * *', 'delete old users');
agenda.start();

1
по какой-то причине при попытке использовать Agenda я получаю сообщение об ошибке ReferenceError: Agenda is not defined. Я установил пакет с NPM, нужно ли мне что-нибудь делать перед созданием экземпляра повестки дня?
user379468

2
Я думаю, вам нужно потребовать это для своей локальной переменной. var Agenda = require ("Повестка дня");
Райан Ву

1
Недавно я написал в блоге комментарий о повестке дня, настройке проекта и структуре проекта goo.gl/5sCNBM
Робин Веруч 01

1
Обратите внимание, что для использования повестки дня вам потребуется запущенный Mongodb
Марк Робсон

1
Создают ли node-cron или повестку дня отдельный системный процесс node? Можете ли вы использовать их в настройке многоузлового процесса?
Прасад Силва

14

Я думаю, что лучший рейтинг

1.node-график

2.later

3.crontab

и образец расписания узлов ниже:

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");
});

Возможно, вы сможете найти ответ в модулях узлов .


1
Мне нравится синтаксис, спасибо, что поделились
Overdrivr

10

Я написал модуль узла, который предоставляет оболочку для 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


4
Ссылка на github не работает (404)
kekko12

это легко читается. Я написал пакет, который используется node-cronкак ответ @Tom. и имеет приятный синтаксис, похожий на ваш. reel().call(() => console.log('hello !!')).everyMinute().run() github.com/shakee93/node-reel
shakee93 05

@ kekko12 Есть в НПМ: npmjs.com/package/every-moment
Али Хесари


1

Для этого я написал небольшой модуль под названием timexe :

  • Его простой, небольшой и надежный код, не имеющий зависимостей.
  • Разрешение выражается в миллисекундах и имеет высокую точность во времени
  • Крон нравится, но не совместим (обратный порядок и другие улучшения)
  • Я тоже работаю в браузере

Установка:

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. Но это не экспресс-функция.


4
Вы должны упомянуть, что вы автор.
a20, 09

13
@ a20 «написал небольшой модуль для этого» означает, что он автор на тот случай, если вы пропустили чтение
PirateApp
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.