使用rufus调度程序完成上一个作业后调度作业

时间:2012-08-30 07:26:24

标签: ruby-on-rails ruby-on-rails-3 scheduled-tasks rufus-scheduler sidekiq

我有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来完成这些后台任务

谢谢

3 个答案:

答案 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,因为它可以让您定义工人的依赖关系图。 (作为免责声明,我是宝石的作者。)