Rails Ruby Rails 计时器 看门狗 计时重置

kai.zhang · 2017年06月13日 · 最后由 gihnius 回复于 2017年06月17日 · 2648 次阅读

各位大牛,我现在有这样一个问题!

使用 ruby,设计一个 30 秒的计时器,如果时间到达 30 秒,可去执行一个自定义函数。但是计时器在 0 到 30 秒计时的过程中,可能每过 5 秒就会接收到一个消息,如果计时器接收到这个消息,便把现在记录的时间重置为 0,重新开始计时。这个循环直到时间到达 30 秒执行指定函数后退出,否则一直会被重置计时。

请问 ruby 有没有实现这种的 gem 包,或者有相应资料。谢谢!

另外我说的这个问题会在 Rails 中使用到。

准确的说是计时器在 0 到 30 秒计时的过程中,任意时间,都可能会接收到一个消息,如果计时器接收到这个消息,便把现在的时间重置为 0,重新开始计时。循环直到时间到达 30 秒时,执行指定函数退出。

定时器英文就是 scheduler 了,一般异步任务队列可以解决,通过 ActiveJob perform_later 来解决,后端接 sidekiq,你的触发器的逻辑要自己去处理

当然 既然知道术语 scheduler 了,那也可以利用这个关键词去寻找适合的 gem

XxxJob.set(wait_until: xx).perform_later(xx) 收到消息以后,把这个队列任务删掉,然后和上面一样再重新创建一条定时任务

貌似这个概念叫【函数节流】?

jasl 回复

使用 ActiveJob,后端接 sidekiq,还要安装使用 redis,这个我之前试过,可以异步执行,应该是一种解决办法。

eventmacine?

你这场景用一般的 scheduler(sidekiq, activejob) 就行了吧,能不加 watchdog 就不加。

办法是在你要延迟处理的对象上做标志,等到 scheduler 运行到时判断这个标志忽略过去就行。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号