Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用carrierwave版本时堆栈级别太深_Ruby On Rails_Ruby_Carrierwave_Sidekiq - Fatal编程技术网

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

Ruby on rails 使用carrierwave版本时堆栈级别太深,ruby-on-rails,ruby,carrierwave,sidekiq,Ruby On Rails,Ruby,Carrierwave,Sidekiq,我正在尝试使用,它或多或少地将一个图像文件保存到数据库(使用carrierwave)。要保存的文件很少,这些文件是从视频文件中提取的关键帧。那就是那个工人的工作 My image uploader定义了几个版本,如下所示: class KeyframeUploader < CarrierWave::Uploader::Base # ... # Keyframe thumbnail sizes version :small do process resize_to_f

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

My image uploader定义了几个版本,如下所示:

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
class KeyframeUploader
问题是,当我试图运行我的Sidekiq Worker时,它抛出了
赛璐珞::FiberStackError:stack level太深了
,解决这个问题的唯一方法是删除我的版本定义。只有当没有任何版本分配给上传程序时,它才起作用

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

你知道我能做什么吗


编辑:我的stracktrace是:

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


我会将目标锁定在您的工作程序中的for循环

for i in 1..(frames_to_extract)
你没有增加i,但你似乎在做一个索引循环。我会将其切换为使用enum带有索引的每个\u

红宝石爱好者倾向于避免使用for循环,因为这是一个令人讨厌的混乱

  • 检查您的模型,看看是否有一个after_save hook,例如,如果您更新该hook中的记录,它将回归到一个无限循环中-您可能有一个after_save,它创建了制作缩略图的作业,然后存储这些缩略图将启动另一个作业
  • 检查线程安全问题,是否列出了您正在使用的任何gem
  • 检查堆栈跟踪,可以看到哪些行正在重复吗
  • 当您不使用sidekiq处理文件时,是否存在错误
  • 问题总是发生还是仅仅在负载下发生
  • Ruby 2.1的RMagick bug-

  • 事实证明,这是carrierwave的错(实际上是osx的错)。带说明的线程:

    解决方案:
    仅供参考
    堆栈级别太深
    意味着您在某个地方有一个无限循环是的,我知道。问题是我不知道在哪里可以买到它。我有点觉得这不是我的错,而是carrierwave的错。你能把你的工人也给我们看看吗?你的代码有一个小错误。31秒有6帧,60秒有3帧。60包含在“其他”中。。。不重要,请注意。你能在这里发布堆栈跟踪吗?另外,您使用的是哪一版本的carrierwave/sidekiq?这似乎是问题所在。。。你可能会看到一大堆相同的“从…截图”日志条目,如果这是问题的话。嗯,当我在sidekiq之外上传图像时也是这样。是的,如果我不使用sidekiq进行处理,也会出现错误。Stacktrace添加到原始问题中。您如何触发后处理?通过回调?还有,你看到了吗?可能是后处理库错误,您使用什么来调整图像大小?你能发布Gemfile.lock吗?是的,我见过那个线程,但我一直在使用rmagick,没有任何问题,我希望保持这种方式。Gemfile.lock:。关于触发后处理-我不知道如何回答,我正在以常规方式从carrierwave readme.mbajur触发它们,据我所知,您正在使用的RMagick版本中存在错误,请查看您的代码是否与其他后处理库一起工作,如果可以,尝试使用RMagick版本和/或ruby版本,直到您的代码正常工作为止,或者失败,请等待RMagick的优秀人员解决问题。我已经发布了一个解决方案,并给出了解释作为答案。谢谢你的支持!哇哦。救了我一天!很高兴你找到了答案。即使您得到的错误中有
    赛璐珞::
    ,但此问题似乎不是
    赛璐珞
    标记的一部分。你同意吗?是的,完全同意。去除赛璐珞标签。
    gem 'rmagick', :require => 'RMagick'