我的情况:
在我的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
都解锁。
有什么想法吗?
答案 0 :(得分:0)
是否将条件从“或”改为“和”帮助?
if s1.lock(-1) && s2.lock(-1)
答案 1 :(得分:0)
添加以防万一。
可能有帮助的是倒计时锁存器(在您的情况下设置为2)。 Task3等待锁存器(例如latch.await()
),Task1和Task2一旦完成就执行latch.countDown()
,让任务3逻辑继续