我的块/产量如何通过变化变量?

时间:2016-10-30 17:02:02

标签: ruby-on-rails ruby ruby-on-rails-5

我正在编写以下模块以捕获偶尔发送给我的延迟作业工作人员的SIGTERM,并设置一个名为term_now的变量,让我的工作能够在它之前正常终止。 ;完成。

如果我把它放在我的工作中,我的模块中的以下代码是完美的,但我需要它用于几个工作,当我把它放在一个模块中它不起作用。

我认为它不起作用,因为它只通过term_now一次(当它是假的时候),即使它返回true它也不会再次通过它,因此它永远不会停止工作。

module StopJobGracefully

  def self.execute(&block)
    begin
      term_now = false
      old_term_handler = trap('TERM') do
        term_now = true
        old_term_handler.call
      end

      yield(term_now)
    ensure
      trap('TERM', old_term_handler)
    end
  end

end

以下是工作内联代码的正常使用方法(这是我尝试转换为模块的代码):

class SMSRentDueSoonJob

  def perform
    begin
      term_now = false
      old_term_handler = trap('TERM') do 
        term_now = true 
        old_term_handler.call
      end

      User.find_in_batches(batch_size: 1000) do

        if term_now
          raise 'Gracefully terminating job early...'
        end

        # do lots of complicated work here
      end

    ensure
      trap('TERM', old_term_handler)
    end
  end

end

1 个答案:

答案 0 :(得分:2)

你基本上自己回答了。在您提供的示例代码中,只有在调用term_now之前捕获陷阱时,yield才会生效。

您需要做的是提供一种定期提取信息的机制,以便您可以在find_in_batches的运行中进行检查。

因此,您的模块应该使用term_now方法而不是产生结果,而不是返回实例变量@term_now