Sinatra 1.3流媒体,带Ruby标准重定向

Sinatra 1.3流媒体,带Ruby标准重定向,ruby,streaming,sinatra,redirect,stdout,Ruby,Streaming,Sinatra,Redirect,Stdout,我想使用Sinatra在1.3中引入的流媒体功能以及一些标准输出重定向。它基本上是一个长时间运行的作业的实时流式输出。我查看了自述文件中的Sinatra流媒体示例 在OSX上运行1.8.7: 使用上面链接中列出的线程化模块,这似乎工作得更好一些。然而,它不流。只有在最后一行out时才将内容打印到浏览器中,我发现s.string会随着时间的推移而定期更新,所以我只是在一个单独的线程中捕获输出,抓住差异并将其输出。似乎字符串重定向的行为与普通IO对象不同 s = StringIO.new t =

我想使用Sinatra在1.3中引入的流媒体功能以及一些标准输出重定向。它基本上是一个长时间运行的作业的实时流式输出。我查看了自述文件中的Sinatra流媒体示例

在OSX上运行1.8.7:


使用上面链接中列出的
线程化
模块,这似乎工作得更好一些。然而,它不流。只有在最后一行
out时才将内容打印到浏览器中,我发现
s.string
会随着时间的推移而定期更新,所以我只是在一个单独的线程中捕获输出,抓住差异并将其输出。似乎字符串重定向的行为与普通IO对象不同

s = StringIO.new
t = Thread.start do
  Thread.current[:stdout] = s
  method_that_prints_text
  sleep 2
end

displayed_text = ''
while t.alive? do
  current_text = s.string
  unless (current_text.eql?(displayed_text))
    new_text = current_text[displayed_text.length..current_text.length]
    out << new_text
    displayed_text = current_text * 1
  end
  sleep 2   
end
s=StringIO.new
t=Thread.start do
当前线程[:stdout]=s
打印文本的方法
睡眠2
结束
显示的文本=“”
当t活着的时候?做
当前_text=s.string
除非(当前_text.eql?(显示的_text))
新建文本=当前文本[显示的文本.长度..当前文本.长度]
出来
s = StringIO.new

Thread.start do
    Thread.current[:stdout] = s
    method_that_prints_text
end.join

while line = s.gets do
    out << line
end

out << s.string
s = StringIO.new
t = Thread.start do
  Thread.current[:stdout] = s
  method_that_prints_text
  sleep 2
end

displayed_text = ''
while t.alive? do
  current_text = s.string
  unless (current_text.eql?(displayed_text))
    new_text = current_text[displayed_text.length..current_text.length]
    out << new_text
    displayed_text = current_text * 1
  end
  sleep 2   
end