防止相同的作业 运行 两次 node-cron

Prevent the same job to run twice node-cron

我正在使用 node 和 typescript,使用 node-cron 2.0 将后台操作安排到每小时 运行。

  cron.schedule("0 0 * * * *", () => {
     purgeResponsesSurveys();
   });

我担心如果该方法未在 1 小时内完成会发生什么,因为我不希望我的方法的两个实例同时 运行。

如果调度程序已经 运行 上次每小时调用一次,那么阻止调度程序调用函数 purgeResponsesSurveys 的最佳做法是什么?

您可以使用 Semaphore 来防止并行调用。

您需要知道 purgeResponsesSurveys 何时完成。因此,如果它是异步的,您将需要 return Promise 或接收一个 callback 将在 purgeResponsesSurveys 完成时调用。

我使用了 semaphore npm 包。 这里有一个小example/simulation.

const semaphore = require('semaphore');

const sem = semaphore(1);

simulateCron(function() {
    console.log('cron was triggered')

    // wrap task with mutex
    sem.take(function() {
        longTask(function(){
            sem.leave();
        })
    })

})

function longTask(cb) {
    console.log("Start longTask")
    setTimeout(function(){
        cb()
        console.log("Done longTask")
    }, 3000)
}

function simulateCron(cb) {
    setInterval(cb, 500)
}
// output
cron was triggered
Start longTask
cron was triggered
cron was triggered
cron was triggered
cron was triggered
cron was triggered
Done longTask
Start longTask
cron was triggered
...