产卵过程循环并在红宝石中持续stdout

时间:2013-12-04 14:24:02

标签: ruby process spawn

我需要用红宝石脚本来表示程序。 这个程序定期打印一个JSON,在主脚本中我需要拦截它并进行计算。 感谢

这样的事情:

MAIN:
   Spawn a process
      //This generates stdout periodically
   //End call
   Intercept its stdout
   //REST of the code

怎么样? 我需要使用eventmachine吗?有些?

我用这段代码澄清

timer = EventMachine.add_periodic_timer POLLING_INTERVAL do
    if memcached_is_running
      ld 'reading from device'
      begin

          IO.popen("HostlinkPollerLight -p #{SERIAL_PORT} -v #{SERIAL_BAUDRATE} -r #{MODEL_CONFIG} 2> /dev/null") do |payload|
                  $_data = JSON.parse payload.readlines[0]
          end


        if $data['success']

          memcache.set( MEMCACHE_DATA_KEY, _to_json( $data[ 'result' ], _mapping ))
          timer.interval = POLLING_INTERVAL
        else
          log_this " read fault: error_code #{$data['fault']}"
          timer.interval = FAULT_INTERVAL
        end
      rescue Errno::ENOENT
        log_this 'Unable to read  output'
      rescue JSON::ParserError
        log_this 'Malformed  data'
      end
    else
      timer.interval = FAULT_INTERVAL
      system("on_red_led.sh 2")
    end
    log_this "elapsed time: #{Time.now.to_f - delta}"
    ld "## end read: #{counter}"

    counter += 1
end

我只需要用popen打开程序一次,并在每次打印stdout时获取stdout。

1 个答案:

答案 0 :(得分:0)

我这样做的方法是,我创建一个类,它创建一个带有无限循环的新线程,它改变了对象的实例变量。然后我可以通过其getter访问这些变量。例如:

class Stopwatch
  def initialize
    @seconds = 0
  end

  def start
    @thread = Thread.new do
      loop {
        sleep(1)
        @seconds += 1
      }
    end
  end

  def seconds
    @seconds
  end

  def stop
    @thread.kill
  end

  def reset
    @seconds = 0
  end
end

stoper = Stopwatch.new
stoper.start

sleep(5)
stoper.seconds #=> 5