このワーカーを 10 回起動して、並行性を感じさせます。
class AnalyzerWorker
@queue = :analyzer
def self.perform
loop do
# My attempt to lock pictures from other worker instances that may
# try to analyze the same picture (race condition)
pic = Pic.where(locked: false).first
pic.update_attributes locked: true
pic.analyze
end
end
end
このコードは実際にはまだ競合状態に対して脆弱です。その理由の 1 つは、ロックされていない画像を取得してから実際にロックするまでに時間のギャップがあるためだと思います。
もっと理由があるかもしれませんが、これを防ぐための強力なアプローチはありますか?