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ものが開始されます...

私の質問:

:task_12 つの異なるタスクを実行していて、それらを呼び出して: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_13 番目のタスクは、ロックが解除されるまで待ちたいと思います:task_2

何か案は?

4

2 に答える 2

0

条件を「または」から「および」に変更すると効果がありますか?

if s1.lock(-1) && s2.lock(-1)
于 2013-10-17T17:54:37.047 に答える