我正在使用Sidekiq和Carrierwave将图像上传到S3。后台作业执行以下操作:
这是代码段:
def store_for_mobile(file)
self.class.process optimize: [1080, 810]
%w(android ios).each do |device|
@directory = File.join('banners/mobile', device)
store!(file)
end
end
def store_for_web(file)
self.class.process optimize: [750, 562]
@directory = 'stores/750x562/'
store!(file)
end
def store_header(file)
self.class.process resize_to_limit: [640, 640]
@directory = 'headers/images/consumer_app_brand_logos/'
store!(file)
end
def store_header_mailer(file)
self.class.process resize_to_limit: [360, 120]
@directory = 'headers/images/360x120/'
store!(file)
end
上述方法分别在不同的作业中执行,这意味着有时它们可以同时运行。
很快,我注意到一些由store_header_mailer
调整大小的图像被上载到了store_for_mobile
,store_for_web
和store_header
应该拥有的目录中。 (例如'headers/images/consumer_app_brand_logos/'
获得了120x120的图像)
使用Resque时不存在此问题。
我查看了载波的源代码,并注意到了
在调用image_magick命令行时,它使用类变量self.processors
和类方法self.process
。
这部分代码是线程安全的吗?预先感谢。
答案 0 :(得分:0)
花了几天时间才弄清楚发生了什么。这是一个很有趣的案例,在这里解释太久了,所以我决定为此写一个post,因此,有关详细信息,请在此处阅读。
长话短说,carrierwave使用类变量来保存处理器的方法和尺寸,并且在上传者完成后不会重置,因此将影响下一个上传者。