我的情况:
在我的 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。
有任何想法吗?