4

我正在构建一个使用 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
4

2 回答 2

5

您可以在 eventmachine 中挂载 Sinatra 应用程序(为您提供支持 EM 的网络服务器,即 Thin)。然后,您应该可以从您的 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
于 2013-12-19T09:04:21.447 回答
0

如果您真的想使用推文流式传输功能,那么您需要将流式传输部分作为一个单独的进程运行并将其结果写入数据库,然后从您的 sinatra 应用程序中读取这些记录。

这就是它的工作原理 twitter 流监听器与你的 sinatra 应用程序是分开的,你需要某种队列来加入它们,比如 redis 或 db 或类似的东西。

于 2013-12-18T00:46:23.877 回答