Как запустить 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 ответа:
Вы можете монтировать приложения 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, или что-то в этом роде.