私の状況:
私の 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
ものが開始されます...
私の質問:
:task_1
2 つの異なるタスクを実行していて、それらを呼び出して:task_2
、3 番目のタスクを開始したいのですが、ロックが解除される:task_1
まで3 番目のタスクをキューに入れたい場合はどうすればよいですか?:task_2
これまでのところ、以下のコードを試してみました。ここでは、:task_1
と:task_2
が実行されているかどうかを確認し、実行されていない場合にのみ 3 番目のタスクを起動します。
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
このコードは適切にロックしますが、ロックを解除すると 3 番目のタスクが開始され:task_1
ます:task_2
。:task_1
3 番目のタスクは、ロックが解除されるまで待ちたいと思います:task_2
。
何か案は?