防止相同的作业 运行 两次 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
...
我正在使用 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
...