Ruby on rails 使用rufus调度程序在上一个作业完成后调度作业

Ruby on rails 使用rufus调度程序在上一个作业完成后调度作业,ruby-on-rails,ruby-on-rails-3,scheduled-tasks,rufus-scheduler,sidekiq,Ruby On Rails,Ruby On Rails 3,Scheduled Tasks,Rufus Scheduler,Sidekiq,我的任务调度程序文件如下所示 require 'rubygems' require 'rufus/scheduler' scheduler = Rufus::Scheduler.start_new scheduler.cron '0 20 * * *' do StartJOb1.perform_async Startjob2.perform_async Startjob3.perform_async Startjob

我的任务调度程序文件如下所示

    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\u async ,Startjob5.perform_async 作业1、作业2和作业3完成后。问题是我不知道完成这些作业需要多长时间

我使用sidekiq来完成这些背景任务


谢谢

这在Cron中是不可能的,您可能应该从当前作业调用下一个作业


而且,由于使用cron,您不需要sidekiq。

我没有使用sidekiq,所以不确定这是否有效。 您可以尝试使用信号量或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,因为互斥体实际用于并行您自己的线程(因此它可能不会在进程上工作,我想sidekiq在它自己的进程中运行?)


除了互斥锁,您可以将作业的状态写入数据库,并从作业4+5进行轮询,以查看作业何时完成。

您也可以使用互斥锁,因为它可以定义工作人员的依赖关系图。(作为免责声明,我是gem的作者。)

实际上StartJOb1是一个使用sidekiq执行一些重功能的类,我只是在使用rufus scheduler安排这些工作人员。@sumskyi u r的回答是正确的,只是在完成各自的任务后,您必须从每个工作人员处呼叫每个工作人员,并且从cron呼叫工作人员不会有任何问题。它将工作。