0

我有如下 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

我需要拆分这些作业,并希望在 job1、job2 和 job3 完成后运行 Startjob4.perform_async 、 Startjob5.perform_async 。问题是我不知道完成这些作业需要多长时间。

我正在使用 sidekiq 执行这些后台任务

谢谢

4

3 回答 3

1

这对于 Cron 是不可能的,可能你应该从当前工作中调用下一个工作。

而且,因为使用了 cron,所以你不需要 sidekiq。

于 2012-08-30T07:40:09.570 回答
0

您也可以为此使用Sidekiq Superworker,因为它可以让您定义工作人员的依赖关系图。(作为免责声明,我是宝石的作者。)

于 2014-09-18T04:56:28.370 回答
0

我没有使用过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一起使用,因为Mutex实际上是用于并行您自己的线程(因此它可能不会在进程上工作,我想sidekiq在它自己的进程中运行?)。

作为互斥锁的替代方案,您可以将作业的状态写入数据库并从作业 4 +5 轮询以查看它们何时完成。

于 2012-08-30T09:43:45.073 回答