2015-07-27 2 views
1

Я пытаюсь запустить процесс, который обрабатывает данные отслеживания рейсов и активно превращает его в строки JSON (непрерывный цикл) вместе с сервером Sinatra, который отвечает на запросы GET этими строками JSON. Я пытаюсь использовать потоки, чтобы справиться с этим, но не имел успеха. Как я могу запустить эти два процесса бок о бок? Вот еще некоторые особенности:Запуск сервера и подпроцесса Sinatra асинхронно

У меня есть класс Aircraft с массивом Aircraft объектов, называемых Aircraft::All. У меня есть метод, который постоянно обновляет этот массив, который я хочу запустить вместе с сервером Sinatra, который отвечает на запросы GET, списком самолетов в формате JSON.

Вот код:

# 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 
+0

Какая у вас конкретная проблема? Не могли бы вы предоставить какой-либо код? – sschmeck

+0

только что отредактировал мой вопрос, чтобы включить код. Благодаря! –

ответ

0

Здесь основной поток приложения Синатра и дополнительная нить загружает данные, что более обычно для меня.

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 
+0

Это трюк, спасибо большое! –

+0

Мне нужен ответ, где Sinatra работает как фоновый процесс (или Thread). – Otheus

Смежные вопросы