我启动这个工人 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
这段代码实际上仍然容易受到竞争条件的影响,我认为原因之一是因为在获取解锁图片和实际锁定它之间存在时间间隔。
也许还有更多的原因,有什么强有力的方法可以防止这种情况发生吗?