载波线程安全吗?

时间:2018-10-29 10:57:56

标签: ruby carrierwave sidekiq

我正在使用Sidekiq和Carrierwave将图像上传到S3。后台作业执行以下操作:

  1. 从远程网址下载图像;
  2. 使用minimagick调整大小;
  3. 将调整大小后的图像上传到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_mobilestore_for_webstore_header应该拥有的目录中。 (例如'headers/images/consumer_app_brand_logos/'获得了120x120的图像)

使用Resque时不存在此问题。

我查看了载波的源代码,并注意到了

https://github.com/carrierwaveuploader/carrierwave/blob/master/lib/carrierwave/uploader/processing.rb#L54

在调用image_magick命令行时,它使用类变量self.processors和类方法self.process

这部分代码是线程安全的吗?预先感谢。

1 个答案:

答案 0 :(得分:0)

花了几天时间才弄清楚发生了什么。这是一个很有趣的案例,在这里解释太久了,所以我决定为此写一个post,因此,有关详细信息,请在此处阅读。


长话短说,carrierwave使用类变量来保存处理器的方法和尺寸,并且在上传者完成后不会重置,因此将影响下一个上传者。