1

我有一个简单的 SuckerPunch 工作,我正在努力让它在任何给定时间只运行一个工作。努力解决它尝试使用赛璐珞和 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
4

1 回答 1

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只能运行一个。有点打败赛璐珞给你的优势:)

于 2014-05-05T07:04:13.530 回答