针对 whenever 每 20 秒走一波任务的需求 利用 rake 任务 首先在 rake 里写好自己想要 20 秒一次的执行的任务 之后再 利用 whenever 的 config/schedule.rb 写一个每分钟执行一次
本狗子第一次发还望各位大佬 多多指教(新手) 有更好的方法 还望指点 以上就是我目前的解决方法
利用 current-ruby 的 Concurrent::ScheduledTask,activejob 的 async_adapter 用的就是这个。
jruby 的话,有 TimerTask
不过我没做过测试,不知道这些解决方案的精准度、容错之类的怎么样。
20s 这种频率的话,我觉得就不一定要用 whenever 了,频率太高用它反而是一种消耗(每次都要初始化环境)
建议直接用 jmettraux/rufus-scheduler,注意不要在 console 里面加载这个就好了
还有一个挺有意思的 gem
https://github.com/nickelser/zhong 中文名大概叫『钟』吧,它依赖了一个 gem 叫 suo 『锁』
他的特点是用了 redis 做执行记录和分布式情况下避免多节点执行,非常有特色的命名方式
要知道,这个作者是个地道的老外
可以用sidekiq-scheduler,是结合了上面的rufus-scheduler
和sidekiq
,还在sidekiq
的后台管理页面里面集成了循环定时任务的管理
xxx 那里 做一个异步处理 交给 active_job 处理
或者就像 @w7938940 同学说的那样 用 sidekiq-scheduler
我大概理解您的意思 我也差不多顺着您的思路 做了一遍 我写了一个每分钟执行一次 然后我又在 job 里写了简单的 10 秒一次执行三次 后面我用 sidekiq 执行这个任务
是这个意思吗
用 sidekiq-scheduler
就不需要 whenever
require 'sidekiq-scheduler'
class ProductScheduler
include Sidekiq::Worker
def perform
puts 'Hello world'
end
end
.
.
.
:schedule:
ProductScheduler:
every: '1m'
『一新呀 你可长点心吧』 突然就想到了这句话,别打我,哈哈哈哈~~~
另外建议用 sidekiq 的同学,有考虑过 LZ 的项目还没有使用 sidekiq 的情况么
如果没有,那么就为了一个 20s 循环任务引入一个 sidekiq + 定时插件,感觉亏亏的
用 daemons 倒是别出心裁,即方便控制,有能保证不因意外死掉,至于执行时间的问题,new 一个新线程就好了 /机智
再提供个思路,用 Concurrent::TimerTask
,actioncable 用的是这个。
ActionCable::Channel::PeriodicTimers
提供了 periodically :transmit_progress, every: 5.seconds
这样的语法糖。