Ruby 来自Sinatra/Rack应用程序的流式数据

Ruby 来自Sinatra/Rack应用程序的流式数据,ruby,sinatra,rack,Ruby,Sinatra,Rack,我试图从Ruby(1.9.1p378)Sinatra(1.0)Rack(1.2.1)应用程序中传输文本数据(XML/JSON)。建议的解决方案(例如)似乎不起作用-当我生成某个无限流的元素时(例如从%w(foo-bar).cycle)服务器只是阻塞。我尝试了webrick和thin作为服务器 有什么建议吗?我应该使用它吗?如果是,我将如何在我的应用程序中使用它?Webrick和Thin都不支持以这种方式进行流式处理。你可以试试杂种或独角兽。如果你想使用薄的或彩虹!,为了实现流式传输,您必须钩住事

我试图从Ruby(1.9.1p378)Sinatra(1.0)Rack(1.2.1)应用程序中传输文本数据(XML/JSON)。建议的解决方案(例如)似乎不起作用-当我生成某个无限流的元素时(例如从
%w(foo-bar).cycle
)服务器只是阻塞。我尝试了
webrick
thin
作为服务器


有什么建议吗?我应该使用它吗?如果是,我将如何在我的应用程序中使用它?

Webrick和Thin都不支持以这种方式进行流式处理。你可以试试杂种或独角兽。如果你想使用薄的或彩虹!,为了实现流式传输,您必须钩住事件循环:

require 'sinatra'

class Stream
  include EventMachine::Deferrable
  def initialize
    @counter = 0
  end

  def each(&block)
    if @counter > 10
      succeed
    else
      EM.next_tick do
        yield counter
        each(&block)
      end
    end
  end
end

get '/' do
  Stream.new
end
我最近以这种方式编写了一个EventSource实现:

require 'sinatra'

class EventStream
  include EventMachine::Deferrable
  def each
    count = 0
    timer = EventMachine::PeriodicTimer.new(1) do
      yield "data: #{count += 1}\n\n"
    end
    errback { timer.cancel }
  end
end

get '/' do
  EventMachine.next_tick do
    request.env['async.callback'].call [
      200, {'Content-Type' => 'text/event-stream'},
      EventStream.new ]
  end
  [-1, {}, []]
end

如果您想使用Webrick进行流媒体:是一个补丁。

您一定要看看机架式的。它支持开箱即用。我将其用于firehose样式的流式api

Goliath既是一个应用程序服务器,也是一个 轻量级框架旨在满足 以下目标:充分 异步处理、中间件 支持,配置简单, 高性能,而且可以说是最 重要的是,可读性和可维护性 代码


正如Colin提到的,Goliath可以流式传输响应数据,以及传入(大文件上传)。repo中有一个将数据流式传输到客户端的示例:


您可以轻松地连接任何其他数据流以将数据推送到客户端,而不是使用计时器。例如,您可以将AMQP队列或任何其他消息队列直接连接到Goliath,并让它充当该数据的HTTP前端

从Sinatra 1.3开始,您还可以使用新的流式API:

get '/evented' do
  stream(:keep_open) do |out|
    EventMachine::PeriodicTimer.new(1) { out << "#{Time.now}\n" }
  end
end
get'/evented'do
溪流(:保持开放)请勿入内|

EventMachine::PeriodicTimer.new(1){out Thin的优点是能够在流媒体传输时回答其他请求。非常有趣的项目!谢谢提示!goliath已经有社区了吗?整个项目似乎非常前沿,我对一些事情很不确定,比如对分块的支持和回调中请求的识别……T邮件列表是一个很好的起点:-有很多人在观看它。不幸的是,一些正在使用Goliath构建的更有趣的应用程序没有公开,但会随着时间的推移而改变。它是最前沿的。-)Konstantin-这适用于所有web服务器还是像Thin这样的事件web服务器?我有g难以找到使用标准服务器(如Passenger)的新流式API的示例代码…仅适用于事件web服务器(如Thin、Rainbows!或Ebb)-但Puma计划支持此功能。不使用
的流式处理:保持打开
可在所有服务器上工作,但不会在所有服务器上流式处理(即不在Webrick上).如果你让它保持打开,你怎么能关闭它?也就是说,我想保持它打开,直到我通过管道传输完所有内容,然后关闭。