各位大牛,我现在有这样一个问题!
使用 ruby,设计一个 30 秒的计时器,如果时间到达 30 秒,可去执行一个自定义函数。但是计时器在 0 到 30 秒计时的过程中,可能每过 5 秒就会接收到一个消息,如果计时器接收到这个消息,便把现在记录的时间重置为 0,重新开始计时。这个循环直到时间到达 30 秒执行指定函数后退出,否则一直会被重置计时。
请问 ruby 有没有实现这种的 gem 包,或者有相应资料。谢谢!
另外我说的这个问题会在 Rails 中使用到。
准确的说是计时器在 0 到 30 秒计时的过程中,任意时间,都可能会接收到一个消息,如果计时器接收到这个消息,便把现在的时间重置为 0,重新开始计时。循环直到时间到达 30 秒时,执行指定函数退出。
定时器英文就是 scheduler 了,一般异步任务队列可以解决,通过 ActiveJob perform_later 来解决,后端接 sidekiq,你的触发器的逻辑要自己去处理
perform_later
当然 既然知道术语 scheduler 了,那也可以利用这个关键词去寻找适合的 gem
XxxJob.set(wait_until: xx).perform_later(xx) 收到消息以后,把这个队列任务删掉,然后和上面一样再重新创建一条定时任务
貌似这个概念叫【函数节流】?
使用 ActiveJob,后端接 sidekiq,还要安装使用 redis,这个我之前试过,可以异步执行,应该是一种解决办法。
eventmacine?
你这场景用一般的 scheduler(sidekiq, activejob) 就行了吧,能不加 watchdog 就不加。
办法是在你要延迟处理的对象上做标志,等到 scheduler 运行到时判断这个标志忽略过去就行。