Dor*_*awk 4 ruby sinatra eventmachine tweetstream
我正在构建一个使用TweetStream的Sinatra应用程序(使用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
Run Code Online (Sandbox Code Playgroud)
您可以在事件机器中安装Sinatra应用程序(为您提供支持EM即瘦的awebserver).然后,您应该可以从Sinatra应用程序完全访问EM反应器循环,以及允许任何其他EM插件运行.
Sinatra食谱有一个很好的例子:
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
Run Code Online (Sandbox Code Playgroud)