如何在 node.js 中设置 6 个月的计时器
How to set up 6 month timer in node.js
我正在尝试提前最多 6 个月安排社交媒体帖子。我正在使用 node-cron, which was inspired by gnu cron。我每秒将一个 脚本设置为 运行 以记录 'tick!' 以进行测试。但是,如果此 nodeJS 服务重新启动或关闭,作业将丢失。
我以为 node-cron 影响了 Crontab,但是 Crontab -l
returns no crontab for kevindanikowski
。
有没有其他(更好)的方法可以让我提前几个月安排工作?
或者我缺少关于 node-cron 的东西以确保我不会丢失 cronjob?
对于真正的长期计时器,您需要以某种方式将超时数据存储在磁盘上。正如您所提到的,如果您纯粹在内存中执行此操作,那么如果服务器重新启动,您将丢失计时信息。
处理这个的方法很简单。这与 cron 使用的算法相同:
记录您希望在磁盘上发生超时的时间 - 格式由您决定,您可以使用 cron 格式或发明您自己的格式。因为它是 javascript 我很想简单地以 JSON 格式记录。
将计时文件读入您的程序。有两种方法可以做到这一点。如果您担心 运行 时间性能,请在程序启动时阅读一次。但是,这意味着如果您编辑该文件,您需要重新启动服务器。如果您希望自动获取文件的更新,请在每次要处理计时事件时读取它。
运行 定时循环。例如,Cron 的分辨率为一分钟。因此 cron 运行s 每隔一分钟循环一次定时器。如果这比每分钟 运行 还好的话。对我来说,我会每 30 秒左右执行一次 setInterval()
。请注意,运行在任何体面的处理器上 javascript 每秒都在运行一个定时器循环并不那么繁重。
在定时器循环中处理来自文件的定时器事件。遍历所有事件并检查它们是否已过期。
就是这样。这就是所有调度系统的工作方式(google 日历、cron 等)。
这是一个非常简单的 javascript 实现:
var events = require("events.js");
// Assume events.js look something like:
// return [ {
// timeout: <millisecs like what Date.now() returns>,
// callback: <function>
// } ]
setInterval(function(){
var now = Date.now();
events.forEach(e=>{
if (e.timeout >= now) {
e.callback(); // execute event
}
});
events = events.filter(e=>e.timeout<now); // remove stale events
},10000); // every 10 seconds
您可以添加奇特的功能,例如在代码对当前事件进行任何更改时将其保存到磁盘,使超时格式易于调试以供人类阅读,定义一个系统以将参数传递给事件回调等。但核心很简单。
我正在尝试提前最多 6 个月安排社交媒体帖子。我正在使用 node-cron, which was inspired by gnu cron。我每秒将一个 脚本设置为 运行 以记录 'tick!' 以进行测试。但是,如果此 nodeJS 服务重新启动或关闭,作业将丢失。
我以为 node-cron 影响了 Crontab,但是 Crontab -l
returns no crontab for kevindanikowski
。
有没有其他(更好)的方法可以让我提前几个月安排工作?
或者我缺少关于 node-cron 的东西以确保我不会丢失 cronjob?
对于真正的长期计时器,您需要以某种方式将超时数据存储在磁盘上。正如您所提到的,如果您纯粹在内存中执行此操作,那么如果服务器重新启动,您将丢失计时信息。
处理这个的方法很简单。这与 cron 使用的算法相同:
记录您希望在磁盘上发生超时的时间 - 格式由您决定,您可以使用 cron 格式或发明您自己的格式。因为它是 javascript 我很想简单地以 JSON 格式记录。
将计时文件读入您的程序。有两种方法可以做到这一点。如果您担心 运行 时间性能,请在程序启动时阅读一次。但是,这意味着如果您编辑该文件,您需要重新启动服务器。如果您希望自动获取文件的更新,请在每次要处理计时事件时读取它。
运行 定时循环。例如,Cron 的分辨率为一分钟。因此 cron 运行s 每隔一分钟循环一次定时器。如果这比每分钟 运行 还好的话。对我来说,我会每 30 秒左右执行一次
setInterval()
。请注意,运行在任何体面的处理器上 javascript 每秒都在运行一个定时器循环并不那么繁重。在定时器循环中处理来自文件的定时器事件。遍历所有事件并检查它们是否已过期。
就是这样。这就是所有调度系统的工作方式(google 日历、cron 等)。
这是一个非常简单的 javascript 实现:
var events = require("events.js");
// Assume events.js look something like:
// return [ {
// timeout: <millisecs like what Date.now() returns>,
// callback: <function>
// } ]
setInterval(function(){
var now = Date.now();
events.forEach(e=>{
if (e.timeout >= now) {
e.callback(); // execute event
}
});
events = events.filter(e=>e.timeout<now); // remove stale events
},10000); // every 10 seconds
您可以添加奇特的功能,例如在代码对当前事件进行任何更改时将其保存到磁盘,使超时格式易于调试以供人类阅读,定义一个系统以将参数传递给事件回调等。但核心很简单。