gpt4 book ai didi

ruby - Sinatra 是多线程的吗?

转载 作者:数据小太阳 更新时间:2023-10-29 06:22:08 25 4
gpt4 key购买 nike

Sinatra 是多线程的吗?我在其他地方读到“默认情况下 sinatra 是多线程的”,这意味着什么?

考虑这个例子

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;dr Sinatra 与 Threads 配合得很好,但您可能必须使用不同的网络服务器。

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

大多数现有的使用线程的 Rack 处理程序将使用线程池来重用线程,而不是为每个传入请求实际创建一个线程,因为线程创建不是免费的,尤其是。在 1.9 上,其中线程 1:1 映射到 native 线程。绿色线程的开销要小得多,这就是为什么光纤,基本上是协同调度的绿色线程,如上面提到的 sinatra-synchrony 使用的,最近变得如此流行。您应该知道,任何网络通信都必须通过 EventMachine,因此您不能使用 mysql gem 来与您的数据库通信。

Fibers 可以很好地扩展网络密集型处理,但对于繁重的计算来说会很失败。如果您使用纤程,您不太可能遇到竞争条件,这是并发的常见陷阱,因为它们只在明确定义的点进行上下文切换(使用同步,每当您等待 IO 时)。还有第三种常见的并发模型:进程。您可以使用 preforking 服务器或自己启动多个进程。虽然乍一看这似乎是个坏主意,但它有一些优点:在正常的 Ruby 实现中,这是同时使用所有 CPU 的唯一方法。并且您避免了共享状态,因此根据定义没有竞争条件。此外,多进程应用程序可以轻松地扩展到多台机器上。请记住,您可以将多进程与其他并发模型(事件、协作、抢占)结合起来。

选择主要取决于你使用的服务器和中间件:

  • 多进程,非预 fork :Mongrel、Thin、WEBrick、Zbatery
  • 多进程,预 fork :Unicorn、Rainbows、Passenger
  • 事件(适合 sinatra 同步):Thin、Rainbows、Zbatery
  • 线程: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)。

关于ruby - Sinatra 是多线程的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6278817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com