我有task_scheduler文件,如下所示,
require 'rubygems'
require 'rufus/scheduler'
scheduler = Rufus::Scheduler.start_new
scheduler.cron '0 20 * * *' do
StartJOb1.perform_async
Startjob2.perform_async
Startjob3.perform_async
Startjob4.perform_async
Startjob5.perform_async
end
我需要拆分这些作业,并希望运行Startjob4.perform_async ,Startjob5.perform_async 在job1,job2和job3完成之后。问题是我不知道完成这些工作需要多长时间。
我正在使用sidekiq来完成这些后台任务
谢谢
答案 0 :(得分:1)
对于Cron来说这是不可能的,可能你应该从当前的工作中调用下一份工作。
而且,由于使用了cron,你不需要sidekiq。
答案 1 :(得分:0)
我没有使用sidekiq所以不确定这是否有效。 您可以尝试使用信号量或Mutex,因为它在rails中调用。与此相似的东西
mutex1, mutex2, mutex3 = new_mutexes_already_locked
StartJOb1.perform_async(mutex1) #-> unlocks mutex1 as soon as work is finished
Startjob2.perform_async(mutex2) #-> unlocks mutex2 as soon as work is finished
Startjob3.perform_async(mutex3) #-> unlocks mutex3 as soon as work is finished
Startjob4.perform_async(mutex1, mutex2, mutex3) #starts work if mutex1..3 unlocked
Startjob5.perform_async(mutex1, mutex2, mutex3) #dito
您也可以使用单个方法启动Job4 + 5,并使用此方法等待锁定mutex1..3
但是我不确定这是否适合你正在做的事情以及它是否适用于sidekiq,因为Mutex实际上是用于并行你自己的线程(因此它可能不适用于进程而且我认为sidekiq运行于这是自己的过程吗?)。
替代互斥锁,您可以将作业状态写入数据库并从作业4 +5轮询以查看它们何时完成。
答案 2 :(得分:0)
您也可以使用Sidekiq Superworker,因为它可以让您定义工人的依赖关系图。 (作为免责声明,我是宝石的作者。)