异步运行Sinatra服务器和子流程



我正在尝试运行一个处理航班跟踪数据的过程,并积极地将其转换为JSON字符串(连续循环过程),以及响应这些JSON字符串的GET请求的Sinatra服务器。我试图使用线程来处理这个问题,但没有成功。我如何同时运行这两个过程?下面是更多的细节:

我有一个类Aircraft,其中Aircraft对象的数组称为Aircraft::All。我有一个方法,不断更新这个数组,我想与一个Sinatra服务器一起运行,以JSON格式响应飞机列表的GET请求。

代码如下:

# starting the data stream from external process
IO.popen("./dump1090") do |data|
    block = ""
    # created sinatra server thread
    t1 = Thread.new do
        set :port, 8080
        set :environment, :production
        get '/aircrafts' do
            return_message = {}
            if !Aircraft::All.first.nil?
                return_message[:status] == 'success'
                return_message[:aircrafts] = message_maker
            else
                return_message[:status] = 'sorry - something went wrong'
                return_message[:aircrafts] = [] 
            end
            return_message.to_json
        end
    end
    # parsing the data in main thread -- the process 
    # I want to run alongside the server (parse_block updates Aircraft::All)
    while line = data.gets
        if line.to_s.split('').first == '*'
          parse_block(block)
          puts block
          Aircraft::All.reject { |aircraft| Time.now.to_f - aircraft.contact_time > 30 }
          block = ""  
        end
        block += line.to_s
  end
end

这里的主线程是Sinatra应用程序,其他线程加载数据,这对我来说更常见。

class Aircraft
  @aircrafts = {}
  def self.all
    @aircrafts
  end
end
Thread.new do
  no = 1
  while true
    Aircraft.all[no] = 'Boing'
    no += 1
    sleep(3)
  end
end
get '/aircrafts' do
  Aircraft.all.to_json
end

最新更新