0

我的情况:

在我的 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- 我现在想要启动第三个任务 - 但我想将第三个任务排队直到:task_1并且:task_2已经被解锁?

到目前为止,我已经尝试了下面的代码,我在其中检查是否正在运行,:task_1然后: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此代码确实正确锁定 - 但它在或:task_2解锁时启动我的第三个任务。我希望我的第三个任务等到两者都:task_1解锁:task_2

有任何想法吗?

4

2 回答 2

0

将条件从“或”更改为“和”有帮助吗?

if s1.lock(-1) && s2.lock(-1)
于 2013-10-17T17:54:37.047 回答
0

只是添加以防有人遇到这个问题。

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

于 2018-05-28T14:16:08.567 回答