警告:堆叠级别太深了
几分钟后,我就在我的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"
致电之前制作剧本?
答案 0 :(得分:2)
这是深度递归,递归的缺点是你可以得到stackoverflow异常(或只是错误)。你的代码有这个:
def increment
# ...
increment
end
所以既然你有所谓的tail recursion
,你就可以将它扩展到loop。在红宝石中它会看起来像:
FIXNUM_MAX = (2**(0.size * 8 -2) -1)
def increment
(1..FIXNUM_MAX).each do |number|
puts number
sleep 0.1
end
end