Sinatra是multithreading的吗?

Sinatra是multithreading的吗? 我读过其他地方,“sinatra是默认multithreading”,这是什么意思?

考虑这个例子

get "/multithread" do t1 = Thread.new{ puts "sleeping for 10 sec" sleep 10 # Actually make a call to Third party API using HTTP NET or whatever. } t1.join "multi thread" end get "/dummy" do "dummy" end 

如果我在其他选项卡或浏览器中随后访问“/ multithread”和“/ dummy”,则在“/ multithread”请求完成之前,不能提供任何内容(在此情况下为10秒)。 如果活动冻结应用程序变得没有响应。

我们如何解决这个问题,而不会产生另一个应用程序的实例?

tl; Sinatra博士可以很好的使用线程,但是你可能需要使用不同的web服务器。

Sinatra本身并不强加任何并发模型,甚至不处理并发。 这是由机架处理程序(networking服务器)完成的,如Thin,WEBrick或Passenger。 Sinatra本身是线程安全的,这意味着如果您的机架处理程序使用多个线程来处理服务器请求,那么它就可以正常工作。 但是,由于Ruby 1.8仅支持绿色线程,而Ruby 1.9具有全局VMlocking,所以线程并不广泛用于并发,因为在这两个版本上,线程并不会真正并行运行。 不过,在JRuby或即将推出的Rubinius 2.0(两种可选的Ruby实现)上都是如此。

大多数现有的使用线程的Rack处理程序将使用线程池来重用线程,而不是实际为每个传入请求创build一个线程,因为线程创build不是免费的, 在1.9线程映射1:1到本地线程。 绿线的开销要小得多,这就是为什么上面提到的sinatra-synchrony使用的基本上是合作安排的绿线的光纤最近变得如此受欢迎。 你应该知道任何networking通信都必须通过EventMachine,所以你不能使用mysql gem来和你的数据库进行通信。

纤维在networking密集处理中可以很好地进行缩放,但是对于繁重的计算而言,这种情况很失败 如果使用光纤,则不太可能遇到竞争条件,这是并发性的常见错误,因为它们只在明确定义的点上进行上下文切换(无论何时等待IO),都会发生同步。 还有第三种常见的并发模型:进程。 您可以使用preforking服务器或自己启动多个进程。 虽然这乍一看似乎是一个坏主意,但它有一些优势:在普通的Ruby实现上,这是同时使用所有CPU的唯一方法。 而你避免共享状态,所以没有竞争条件的定义。 而且,多进程应用程序可以轻松扩展到多台机器上。 请记住,您可以将多个进程与其他并发模型(即使是合作,抢占式)结合在一起。

select主要由您使用的服务器和中间件完成:

  • 多进程,非预处理:Mongrel,Thin,WEBrick,Zbatery
  • 多进程,preforking:独angular兽,彩虹,乘客
  • Evented(适合sinatra-synchrony):薄,彩虹,Zbatery
  • Threaded:Net :: HTTP :: Server,Threaded Mongrel,Puma,Rainbows,Zbatery,Thin [1], Phusion Passenger Enterprise> = 4

[1]自从Sinatra 1.3.0以来,Thin将以线程模式启动,如果它是由Sinatra启动的(即使用ruby app.rb ,而不是使用thin命令或rackup )。

当用Googlesearch时,发现这个gem:

西纳特拉同步性

这可能会帮助你,因为它触及你的问题。

还有一个基准,他们做了几乎相同的事情就像你想(外部电话)。

结论:EventMachine就是这里的答案!

我想我可能会为遇到这个问题的人详细说明。 Sinatra包含了这一小块代码:

  server.threaded = settings.threaded if server.respond_to? :threaded= 

Sinatra会检测到你已经安装了一个web服务器(又名,瘦,美洲狮,什么),如果它响应“线程”将设置为线程如果请求。 整齐。

在对代码进行一些更改后,我可以在mizuno上运行padrino / sinatra应用程序。 最初我尝试在jRuby上运行Padrino应用程序,但是它太简单了,我没有调查为什么。 在jRuby上运行时,我正面临JVM崩溃。 我也阅读了这篇文章,这让我想到为什么即使selectRuby,如果部署可以是简单的。

有没有关于在ruby中部署应用程序的讨论? 或者我可以产卵一个新的线程:)

我最近一直在和JRuby进行交stream,我非常惊讶从MRI切换到JRuby是多么的简单。 它几乎涉及淘汰一些gem(在大多数情况下)。

您应该看看JRuby和Trinidad(App Server)的组合。 Torquebox也似乎是一个有趣的一体化解决scheme,它不仅仅是一个应用程序服务器。

如果你想要一个支持线程的应用服务器,并且熟悉Mongrel,Thin,Unicorn等,那么Trinidad可能是最容易迁移的,因为从用户的angular度来看,它几乎是相同的。 爱它到目前为止!