使用carrierwave版本时堆栈级别太深

时间:2014-03-05 18:37:23

标签: ruby-on-rails ruby carrierwave sidekiq

我正在尝试使用sidekiq worker,它或多或少地将图像文件保存到数据库(使用carrierwave)。保存的文件很少,这是从视频文件中提取的关键帧。这就是那个工人的意思。

我的图片上传器定义了几个版本,如下所示:

class KeyframeUploader < CarrierWave::Uploader::Base

  # ...

  # Keyframe thumbnail sizes
  version :small do
    process resize_to_fill: [180, 180], if: :square?
    process resize_to_fill: [320, 180], if: :not_square?
  end

  version :medium do
    process resize_to_fill: [460, 460], if: :square?
    process resize_to_fill: [640, 460], if: :not_square?
  end

  version :large do
    process resize_to_fill: [720, 720], if: :square?
    process resize_to_fill: [1280, 720], if: :not_square?
  end


  private

    # Checks if image is a square
    def square? file
      img = Magick::Image.read(file.path)
      img[0].columns == img[0].rows
    end

    # Oposite to #square?
    def not_square? file
      !square? file
    end

end

问题是,当我尝试运行我的Sidekiq Worker时,它会抛出Celluloid::FiberStackError: stack level too deep,解决这个问题的唯一方法是删除我的版本定义。仅当没有为上传者分配任何版本时,它才有效。

我尝试将保存过程移动到另一个工作人员或使用Carrierwave :: Backgrounder,但我总是得到相同的结果。

你知道我该怎么办吗?


编辑:我的stracktrace是:

  

SystemStackError:堆栈级别太深了   /usr/local/rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/irb/workspace.rb:86

3 个答案:

答案 0 :(得分:40)

事实证明,它是一个载波故障(实际上,osx故障)。带有解释的主题:https://github.com/carrierwaveuploader/carrierwave/issues/1330

解决方案:

gem 'rmagick', :require => 'RMagick'

答案 1 :(得分:1)

我会针对你的工人的for循环。

for i in 1..(frames_to_extract)

您没有递增 i ,但您似乎正在进行索引循环。我会将其切换为使用枚举 each_with_index

Rubyists倾向于避免 for 循环,因为它是一个讨厌的混乱。

答案 2 :(得分:0)

  1. 检查你的模型,看看你是否有一个after_save钩子,例如如果你在那个钩子中更新记录就会回归到无限循环中 - 你可能有一个创造了制作缩略图然后存储这些缩略图的工作会启动另一项工作
  2. 检查线程安全问题,是您列出的任何宝石here
  3. 检查堆栈跟踪,你能看到哪些行重复吗?
  4. 是您不使用sidekiq处理文件时出现的错误?
  5. 问题是总是发生还是只是在负载下?
  6. Ruby 2.1的RMagick错误 - https://github.com/rmagick/rmagick/issues/100
  7. ...