我一直在成功地使用 Sidekiq 来运行由 Rails 3.2 应用程序中的用户操作启动的后台作业。我的特定应用程序涉及通过第三方 API 从外部源发送和接收数据。
我需要通过不断检查每个用户是否有可下载的数据来保持数据与此外部源同步。
到目前为止,我所有的后台工作都是用户启动的,如上所述。我的问题是,如果我想在 while
中持续检查每个用户是否存在外部数据我想象的循环:
# pseudocode
while true
for user in User.active
data = user.get_data
next if data.blank?
UserDataWorker.perform_async(user.id)
end
end
那么我把上面的代码放在哪里呢?我对如何产生连续任务感到困惑。我不想将代码放在 Sidekiq 工作器中,因为它只是一个永远不会完成的工作。还是我应该这样做?
我不想把它放在一个 rake 任务中,因为那我如何监控那个 rake 任务?我读到的关于 Sidekiq 的所有内容似乎都指向一个 Worker 正在运行一个有限且能够完成或出错的任务。我很感激你能提供的任何帮助。
最佳答案
Ruby 多线程就是为了这个。在您的 initializers 文件夹中生成一个线程:
Thread.new do
loop do
for user in User.active
data = user.get_data
next if data.blank?
UserDataWorker.perform_async(user.id)
end
sleep 1
end
end
如果你的支票不需要太多资源,应该没问题。
关于ruby-on-rails-3 - 如何使用 Sidekiq 运行连续的后台作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17812784/