确保只有一个作业在rails SuckerPunch / Celluloid上运行

时间:2014-05-05 06:52:37

标签: ruby-on-rails celluloid sucker-punch

我有一个简单的SuckerPunch工作,我试图让它在任何给定时间只运行一个工作。努力解决它尝试使用Celluloid和Ruby并发

我有什么

DataChangeJob.new.async.perform

class DataChangeJob
  include SuckerPunch::Job
  def perform
    value = Random.rand
    SuckerPunch.logger.info ("starting #{value}")
    sleep(5)
    SuckerPunch.logger.info ("running data change #{value}")
  end
end

1 个答案:

答案 0 :(得分:1)

如果你定义只有一个工人,那就可以达到你想要的效果。默认情况下,SuckerPunch假设有两名工人。所以明确定义1如下:

class DataChangeJob
  include SuckerPunch::Job
  workers 1

  def perform
    value = Random.rand
    SuckerPunch.logger.info ("starting #{value}")
    sleep(5)
    SuckerPunch.logger.info ("running data change #{value}")
  end
end

你让我很好奇:为什么你需要这个约束?

[更新]虽然SuckerPunch确实允许1名工人,但赛璐珞却没有。所以你回到了使用互斥锁。

class DataChangeJob
  include SuckerPunch::Job

  def initialize
    @@mutex = Mutex.new 
  end

  def perform
    @@mutex.lock
    begin
      value = Random.rand
      SuckerPunch.logger.info ("starting #{value}")
      sleep(5)
      SuckerPunch.logger.info ("running data change #{value}")
    end
  ensure
    @@mutex.unlock
  end   
end

这只是一个快速的记录。假设所有作业都是DataChangeJob的实例,我们在类级别上使用互斥锁。锁定互斥锁将尝试锁定互斥锁,并等待互斥锁空闲。 ensure 阻止将确保我们unlock无论发生什么都是互斥锁。

这将确保一次只能运行一个DataChangeJob。有点击败优势赛璐珞给你:))