为什么TestClass#foo不按预期工作? (下面的详细信息和示例)

时间:2017-09-03 01:17:04

标签: ruby

我不确定这里发生了什么或者要问什么,真的,所以我不得不写一个例子。

预期行为:

  1. test.start被称为
  2. 在启动方法中调用
  3. foo {bar} 每隔5秒调用
  4. bar,每次都会记录到该文件;它总共做了3次
  5. 一切正常,直到第3点。查看时间戳,foo.bar似乎每5秒调用一次,但在循环终止之前它不会输出到文件。实际上,它在15秒后连续3次登录到文件。

    require 'logger'
    
    module Logging
      def logger
        Logging.logger
      end
    
      def self.logger
        @logger ||= Logger.new(STDOUT)
      end
    end
    
    class TestClass
      include Logging
      def initialize delay, log_path
        @delay = delay
        @log_path = log_path
      end
    
      def start
        File.delete @log_path if File.exist? @log_path
        exit if fork
        Process.setsid
        exit if fork
        Dir.chdir '/'
        STDOUT.reopen(@log_path, 'a')
        STDERR.reopen(@log_path, 'a')
        foo { bar }
      end
    
    
      def foo &block
        3.times do
          yield
          sleep @delay
        end
      end
    
      def bar
        logger.info(self.class.name) { "testing" }
      end
    end
    
    test = TestClass.new(5, "#{Dir.pwd}/test.log")
    test.start
    

    谁能告诉我这里我做错了什么? foo方法在实际代码中并不像在这里那样多余。

1 个答案:

答案 0 :(得分:1)

这只是缓冲的输出。您可以强制输出写入immediatley而不是使用IO#sync=进行缓冲。

例如:

STDOUT.reopen(@log_path, 'a')
STDOUT.sync = true