堆栈级别太深,在WARN之前运行函数

时间:2014-11-30 11:39:59

标签: ruby-on-rails sidekiq

警告:堆叠级别太深了 几分钟后,我就在我的sidekiq控制台上了。我有一个sidekiq的背景脚本,每0.1秒重复一次。我只运行1并发。但在它说“WARN:堆栈级别太深”之后,工作人员重新开始,并且我的所有本地变量数据都刷新了。这很糟糕。
然后我想在“堆栈级别太深”警告之前运行脚本。如何在收到此警告之前调用函数?


我运行sidekiq:bundle exec sidekiq -c 1
我的sidekiq:

class HardWorker
  include Sidekiq::Worker
  require 'sidekiq/api'
  sidekiq_options :retry => false

  def perform
    self.recalculate
  end

  def recalculate
    @number = 0
    def increment
      @number = @number+1
      sleep 0.1
      puts (@number)
      increment
    end
  end
end

我的控制台日志(递增)

882
883
884
2014-11-30T10:39:26.973Z 5071 TID-qoeag HardWorker JID-3279857b07c31ab4481db5e8 INFO: fail: 89.005 sec
2014-11-30T10:39:26.975Z 5071 TID-qoeag WARN: {"retry"=>true, "queue"=>"default", "class"=>"HardWorker", "args"=>[], "jid"=>"3279857b07c31ab4481db5e8", "enqueued_at"=>1417339371.1692605, "error_message"=>"stack level too deep", "error_class"=>"SystemStackError", "failed_at"=>1417342603.6595845, "retry_count"=>1, "retried_at"=>1417343966.9730375}
2014-11-30T10:39:26.975Z 5071 TID-qoeag WARN: stack level too deep
2014-11-30T10:39:26.975Z 5071 TID-qoeag WARN: /home/vartotojas/.rvm/gems/ruby-2.1.2/gems/sidekiq-3.2.6/lib/sidekiq/processor.rb:110
2014-11-30T10:39:26.980Z 5071 TID-qoeag HardWorker JID-63fc10dfe81abb4fdb29a4a1 INFO: start
1
2
3

..我需要它总是在后台增加,但不在数据库中增加。

如果无法停止调用Worker,那么我想在堆栈级别太深的WARN之前,将我的上一个@number保存到数据库。
如何在"stack level too deep"致电之前制作剧本?

1 个答案:

答案 0 :(得分:2)

这是深度递归,递归的缺点是你可以得到异常(或只是错误)。你的代码有这个:

def increment
  # ...
  increment
end

所以既然你有所谓的tail recursion,你就可以将它扩展到。在红宝石中它会看起来像:

FIXNUM_MAX = (2**(0.size * 8 -2) -1)
def increment
  (1..FIXNUM_MAX).each do |number|
     puts number
     sleep 0.1
  end
end