首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何每X分钟执行一段代码?

如何每X分钟执行一段代码?
EN

Stack Overflow用户
提问于 2013-05-09 04:09:06
回答 3查看 521关注 0票数 0

假设我有一个链接聚合应用程序,用户可以对链接进行投票。我使用一个算法生成的热度分数对链接进行排序,该算法在链接投票时运行。然而,在每一次投票中运行它似乎都太过分了。我如何限制它,使其不超过,比如说,每5分钟运行一次。

EN

回答 3

Stack Overflow用户

发布于 2013-05-09 04:11:20

a)使用cron作业

b)跟踪过程最后一次运行时的时间戳,以及当前时间戳-您存储的时间戳>5分钟时,然后运行过程并更新时间戳。

票数 1
EN

Stack Overflow用户

发布于 2013-05-09 04:46:46

代码语言:javascript
复制
var yourVoteStuff = function() { 

    ...

    setTimeout(yourVoteStuff, 5 * 60 * 1000);
};

yourVoteStuff();

在询问为什么不使用setTimeinterval之前,请阅读下面的评论。

为什么是“为什么是setTimeinterval”而不是“为什么是cron作业?”,我错了吗?

票数 1
EN

Stack Overflow用户

发布于 2013-05-09 05:53:31

  • 首先,你需要构建一个接收器来接收所有提交的链接。
  • 其次,接收器将每个(已经收到的)链接推送到一个队列中(我强烈建议你有一个聚合器,它会按照你想要的时间间隔循环)。在这个循环中,每个排队的链接都应该被轮询()并继续到您的业务逻辑。

我已经将此解决方案用于生产级别,我可以告诉您,它的伸缩性很好,因为它也执行得很好。

使用示例;

代码语言:javascript
复制
var MIN = 5; // don't run aggregation for short queue, saves resources
var THROTTLE = 10; // aggregation/sec
var queue = [];
var bucket = [];
var interval = 1000; // 1sec

flow.on("submission", function(link) {
    queue.push(link);
});

___aggregationLoop(interval);
function ___aggregationLoop(interval) {
    setTimeout(function() {
        bucket = [];
        if(queue.length<=MIN) {
            ___aggregationLoop(100); // intensive
            return;
        }
        for(var i=0; i<THROTTLE; ++i) {
            (function(index) {
                bucket.push(this);
            }).call(queue.pop(), i);
        }
        ___aggregationLoop(interval);
    }, interval);
}

干杯!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16449312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档