Sinatra 1.3流媒体,带Ruby标准重定向
我想使用Sinatra在1.3中引入的流媒体功能以及一些标准输出重定向。它基本上是一个长时间运行的作业的实时流式输出。我查看了自述文件中的Sinatra流媒体示例 在OSX上运行1.8.7: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 =
使用上面链接中列出的
线程化
模块,这似乎工作得更好一些。然而,它不流。只有在最后一行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