如果您定义只有一名工人,那将实现您想要的恕我直言。默认情况下,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
只能运行一个。有点打败赛璐珞给你的优势:)