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