我正在尝试使用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
答案 0 :(得分:40)
gem 'rmagick', :require => 'RMagick'
答案 1 :(得分:1)
我会针对你的工人的for循环。
for i in 1..(frames_to_extract)
您没有递增 i ,但您似乎正在进行索引循环。我会将其切换为使用枚举和 each_with_index 。
Rubyists倾向于避免 for 循环,因为它是一个讨厌的混乱。
答案 2 :(得分:0)