我有一个简单的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
答案 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
。有点击败优势赛璐珞给你:))