我有以下代码:
[23, 45, 69, 20].each do |page_id|
Resque.enqueue(ProcessPage, page_id)
end
我想知道所有这些作业何时完成处理以通过电子邮件通知用户。我的第一次尝试是在作业结束时通知用户,但这只能针对每个作业单独进行。
我找到了这颗 gem resque-status ,基本上可以让你这样做:
job_ids = []
[23, 45, 69, 20].each do |page_id|
job_ids << ProcessPage.create(page_id)
end
然后您可以通过执行以下操作来检查作业的状态:
status = Resque::Plugins::Status::Hash.get(job_id)
令我困惑的是...我应该什么时候检查所有状态?我的意思是,我会花一些时间检查所有工作的状态吗?这会使服务器超时,我有什么想法可以做到这一点吗?
最佳答案
我不会在此处粘贴任何代码,因为看起来您非常熟悉应如何编写作业,但请考虑以下想法:
您应该有一个 resque 作业,它获取要处理的 id 数组。 此 resque 作业为每个 id 创建一个 resque 作业,以便并行处理它们。 在为特定 id 创建 resque 作业后,它将创建另一个 resque 作业,该作业获取 id 列表并定期检查它们以查看它们是否已完成。完成后,此作业将向用户发送一封电子邮件。
通过这个范例,你可以享受所有的世界:
- 每个 ID 都有自己的工作。
- 并行执行。
- 状态检查在后台完成,因此用户不会超时。
更新:
检查resque作业的伪代码:
class CheckerJob
@queue = :long
def self.perform(ids)
finished = []
while finished.size < ids.size
ids.each do |id|
finished << id if job_finished?(id)
end
sleep 10
end
send_email_to_user
end
end
现在您要做的就是实现 job_finished?(id)
和 send_email_to_user
方法。
关于ruby-on-rails - 如何查明一组 Resque 作业是否已完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20501028/