如何让redis-semaphore队列“task_3”直到“task_1”和“task_2”被解锁(rails)?

时间:2013-10-17 16:44:30

标签: ruby-on-rails ruby redis mutex semaphore

我的情况:

在我的Rails应用程序中,我使用 redis-semaphore 来确保重复出现的作业不会相互偶然发生。我用这些代码行完成:

s1 = Redis::Semaphore.new(:task_1, connection: "localhost")

if s1.lock(-1)
  begin
    # Perform task_1
  rescue => e
    puts e
  ensure
    s1.unlock
  end
end

这一切都很好,如果还没有:task_1正在进行,:task_1会排队等候。当已经运行的:task_1已经完成并解锁时,排队的:task_1将会启动...

我的问题:

如果我正在运行2个不同的任务 - 让我们称之为:task_1:task_2 - 我现在想要开始第3个任务 - 但我想将第3个任务排队到{{1} }和:task_1已解锁?

到目前为止,我已经尝试了下面的代码,我检查:task_2:task_1是否正在运行,然后只启动我的第3个任务(如果它们都没有运行):

:task_2

此代码可以正确锁定 - 但是当s1 = Redis::Semaphore.new(:task_1, connection: "localhost") s2 = Redis::Semaphore.new(:task_2, connection: "localhost") if s1.lock(-1) || s2.lock(-1) begin # Perform some task when task_1 and task_2 are both done rescue => e puts e ensure s1.unlock s2.unlock end end :task_1解锁时,它会启动我的第3个任务。我希望我的第3个任务要等到:task_2:task_1都解锁。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

是否将条件从“或”改为“和”帮助?

if s1.lock(-1) && s2.lock(-1)

答案 1 :(得分:0)

添加以防万一。

可能有帮助的是倒计时锁存器(在您的情况下设置为2)。 Task3等待锁存器(例如latch.await()),Task1和Task2一旦完成就执行latch.countDown(),让任务3逻辑继续