Как запустить EventMachine и обслуживать страницы в Sinatra?


Я создаю приложение Sinatra, которое использует TweetStream (который слушает твиты с помощью EventMachine). Я также хотел бы, чтобы приложение обслуживало страницы, как обычное приложение Sinatra, но, похоже, Sinatra не может "слушать" запросы страниц, когда он" слушает " твиты.

Это то, что я могу исправить, используя другой сервер или структурируя свое приложение другим способом? Я пробовал использовать WebBrick и Thin.

Вот в основном то, что я делаю:

class App < Sinatra::Base

  # listening for tweets
  @client = TweetStream::Client.new
  @client.track(terms) do |status|
    # do some stuff when I detect terms
  end  

  get '/' do
    "Here's some page content!"
  end

end
2 4

2 ответа:

Вы можете монтировать приложения Sinatra в eventmachine (предоставляя вам веб-сервер, который поддерживает EM, т. е. тонкий). После этого у вас должен быть полный доступ к контуру em reactor из вашего приложения Sinatra, а также возможность запуска любых других плагинов EM.

Рецепты Синатры имеют хороший пример:

Http://recipes.sinatrarb.com/p/embed/event-machine

Вот очень урезанная версия кода:

require 'eventmachine'
require 'sinatra/base'
require 'thin'

def run(opts)

  EM.run do
    server  = opts[:server] || 'thin'
    host    = opts[:host]   || '0.0.0.0'
    port    = opts[:port]   || '8181'
    web_app = opts[:app]

    dispatch = Rack::Builder.app do
      map '/' do
        run web_app
      end
    end

    unless ['thin', 'hatetepe', 'goliath'].include? server
      raise "Need an EM webserver, but #{server} isn't"
    end

    Rack::Server.start({
      app:    dispatch,
      server: server,
      Host:   host,
      Port:   port
    })
  end
end

class HelloApp < Sinatra::Base

  configure do
    set :threaded, false
  end

  get '/hello' do
    'Hello World'
  end

  get '/delayed-hello' do
    EM.defer do
      sleep 5
    end
    'I\'m doing work in the background, but I am still free to take requests'
  end
end

run app: HelloApp.new

Если вы действительно хотите использовать функцию потоковой передачи твитов, то вам нужно запустить потоковую часть как отдельный процесс и записать ее результаты, скажем, в базу данных,а затем прочитать эти записи из вашего приложения sinatra.

Слушатель потока twitter-это отдельная вещь от вашего приложения sinatra, и вам нужна какая-то очередь, чтобы присоединиться к ним, скажем redis или db, или что-то в этом роде.