主线程是否“总是”在ruby web服务器上运行,比如Sinatra?
当您从web请求处理程序中启动线程时,该线程是否会在服务器运行期间继续运行主线程是否“总是”在ruby web服务器上运行,比如Sinatra?,ruby,multithreading,sinatra,Ruby,Multithreading,Sinatra,当您从web请求处理程序中启动线程时,该线程是否会在服务器运行期间继续运行 类似于但您不能调用join并按照自己的计划完成所有线程,很可能是在web请求处理程序向浏览器返回http响应之后?一旦主线程退出,所有其他线程也会被强制销毁,进程也会退出 Thread.new do # this thread never exists on its own while true do puts "." sleep 1 end end sleep 5 在本例中,一旦主线程结
类似于但您不能调用join并按照自己的计划完成所有线程,很可能是在web请求处理程序向浏览器返回http响应之后?一旦主线程退出,所有其他线程也会被强制销毁,进程也会退出
Thread.new do
# this thread never exists on its own
while true do
puts "."
sleep 1
end
end
sleep 5
在本例中,一旦主线程结束,打印线程也将结束,而不会完成其工作。在退出主线程之前,您必须显式地加入所有后台线程以等待其完成
另一方面,只要主线程运行,其他线程就可以随心所欲地运行。对请求/响应周期没有任意限制。但是请注意,在原始的Rubies中,线程并不是真正并发的,而是受GIL的约束。如果您想要真正的并发性,在您的计算机上使用具有不同线程的多核,那么您应该看看JRuby或Rubinius 2.0-preview,它们都提供真正的并发线程
如果您只是想在请求周期之外处理一些事情,那么1.8中的绿色线程和1.9中的操作系统本机但镀金线程就可以了。如果您想要更大的可伸缩性,您应该看看像or这样的技术,它们为后台作业引入了持久工作线程。下面的代码对我来说很好-在OS X本地机器上进行了测试,我能够使用thin和ruby 1.9.2运行1500多个实际线程。在Heroku cedar堆栈上,在创建线程时出错之前,我可以运行大约230个线程 在这两种情况下,所有线程似乎都会在启动后2分钟内完成在Heroku上渲染大约60毫秒,然后20个线程分别运行2分钟 如果刷新/几次,然后等待几分钟,您可以看到线程正在完成。我测试了2分钟的原因是heroku对回答有30秒的限制,如果你花的时间超过了30秒,你就会被打断。但这似乎并不影响后台线程
$threadsLaunched = 0
$$threadsDone = 0
get '/' do
puts "#{Thread.list.size} threads"
for i in 1..20 do
$threadsLaunched = $threadsLaunched + 1
puts "Creating thread #{i}"
Thread.new(i) do |j|
sleep 120
puts "Thread #{j} done"
$threadsDone = $threadsDone + 1
end
end
puts "#{Thread.list.size} threads"
erb :home
end
home.erb
<div id="content">
<h1> Threads launched <%= $threadsLaunched.to_s %> </h1>
<h1> Threads running <%= Thread.list.count.to_s %> </h1>
<h1> Threads done <%= $threadsDone.to_s %> </h1>
</div> <!-- id="content" -->
我刚刚在ruby 1.9上进行了测试,一次可以运行1000个线程,每次访问服务器都会启动100个线程。请参阅下面的代码。是的,但是服务器总是运行主线程-直到有人杀死服务器。@TomAndersen那么我似乎误解了您最初的问题。我修改了我的答案。据我所知,Rubinius在Rubinius 2.0预览版中有真实的线程,但在当前的1.2.4版本中没有。@JonasElfström是的,你是对的。我已经很久没有使用过1.x版本了:也就是说,对于大多数寻求替代实现的人来说,JRuby可能更具吸引力。。。