Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
主线程是否“总是”在ruby web服务器上运行,比如Sinatra?_Ruby_Multithreading_Sinatra - Fatal编程技术网

主线程是否“总是”在ruby web服务器上运行,比如Sinatra?

主线程是否“总是”在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 在本例中,一旦主线程结

当您从web请求处理程序中启动线程时,该线程是否会在服务器运行期间继续运行


类似于但您不能调用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可能更具吸引力。。。