加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 如何在Sinatra中运行EventMachine并提供页面服务?

发布时间:2020-12-17 02:39:57 所属栏目:百科 来源:网络整理
导读:我正在构建一个使用TweetStream的Sinatra应用程序(使用EventMachine侦听推文).我也希望该应用程序像普通的Sinatra应用程序一样提供页面,但似乎Sinatra在“倾听”推文时无法“收听”页面请求. 这是我可以通过使用不同的服务器或以不同的方式构建我的应用程序
我正在构建一个使用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

解决方法

您可以在事件机器中安装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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读