Sinatra 是多线程的吗?

2024-03-29

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 配合得很好,但您可能必须使用不同的 Web 服务器。

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

大多数使用线程的现有机架处理程序将使用线程池来重用线程,而不是为每个传入请求实际创建一个线程,因为线程创建不是免费的,尤其是。在 1.9 中,线程以 1:1 的方式映射到本机线程。绿色线程的开销要少得多,这就是为什么 Fiber(基本上是协作调度的绿色线程,如上面提到的 sinatra-synchrony 使用的)最近变得如此流行的原因。您应该注意,任何网络通信都必须经过 EventMachine,因此您不能使用mysql例如,gem 可以与您的数据库对话。

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

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

  • 多进程、非预分叉:Mongrel、Thin、WEBrick、Zbatery
  • 多进程、预分叉:Unicorn、Rainbows、Passenger
  • Evented(适合 sinatra 同步):Thin、Rainbows、Zbatery
  • 线程:Net::HTTP::Server、Threaded Mongrel、Puma、Rainbows、Zbatery、Thin[1]、Phusion 客运企业 >= 4 https://www.phusionpassenger.com/

[1] 自 Sinatra 1.3.0 起,如果 Thin 由 Sinatra 启动(即使用ruby app.rb,但不与thin命令,也不与rackup).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sinatra 是多线程的吗? 的相关文章

随机推荐

  • 如何根据允许的来源列表设置 Access-Control-Allow-Origin 标头的值?

    我读过很多帖子 但没有一个起作用 我在安装了 ubuntu 16 04 和 nginx 的 aws 中安装了 ec2 进入了site available site enabled to Access Control Allow Origin
  • java8 中的多个 Null 检查处理

    我计划添加一些可读的代码 而不是在下面的情况下进行多个空检查 可能需要 java 8 流 映射的帮助 有人可以帮我解决这个问题吗 private String getRailsServiceClass IRailsComponent rai
  • 如何获取wcf应用程序的工作路径?

    我想要获取 WCF 应用程序的工作文件夹 我怎么才能得到它 If I try HttpContext Current Request MapPath HttpContext Current Request ApplicationPath 我
  • 添加项目时,Observablecollection 不更新列表

    我正在使用 MVVM 模式 并且想要使用可观察集合来更新 ListView 我经历了几个这样的问题 但看不出我做错了什么 任何帮助深表感谢 谢谢 视图 xaml 命名空间 xmlns local clr namespace MusicPla
  • 我们如何使用 try finally 来实现 Lock.lock 和 Lock.unlock

    考虑以下代码 为了阻止IndexOutOfBoundsException打电话时listIterator 我们使用读取器锁来检索基于索引的迭代器 并在其他地方使用写入器锁进行写入操作stockCodes 请注意 我们没有使用任何锁定机制来迭
  • Scala 宏:获取参数默认值

    我有下一个代码 我想从值中提取默认参数 def extractor T macro extractorImpl T def extractorImpl T c WeakTypeTag c Context first i got a type
  • 使用 goroutine 时 HTTP GET 请求的时间响应

    我有一个简单的代码 可以打印文本文件 url list txt 中列出的每个 URL 的 GET 响应时间 当请求按顺序触发时 返回的时间对应于各个 URL 的预期响应时间 然而 当同时执行相同的代码时 返回的响应时间通常比预期要长 看来开
  • 如何使用 CMake 和 Visual Studio 2010(64 位)构建 MATLAB R2011a(64 位)mex 文件?

    我想写一个CMakeLists txt这样 CMake 编写 Visual Studio 2010 64 位 解决方案文件 以从 C 代码为 MATLAB R2011a 64 位 构建 mex 函数example cxx 我不想使用 MAT
  • PHP MongoDB映射减少数据库断言失败

    我第一次使用 PHP MongoDB 进行 Map Reduce 运行 MapReduce 命令时遇到错误 My code map function emit this topic id re date this date posted r
  • 为什么我的代码没有返回任何内容

    目前对编程还很陌生 正在尝试学习Python 我有这段代码 但我不明白为什么我没有得到返回值 balance 3200 annualInterestRate 0 2 monthlyInterestRate annualInterestRat
  • 如何在perl中的本地范围内访问导入模块中的变量?

    我在创建 perl Moose 模块时陷入困境 我有一个全局 pm 模块 package XYZ require Exporter our ISA qw Exporter EDIT missed this line our EXPORT O
  • Django-MPTT,如何

    嘿 我刚刚安装了 django mptt 库 但我不知道如何让它工作 我已经添加了 from mptt models import MPTTModel class Category MPTTModel slug models SlugFie
  • 这些未定义的检查在行为上是否相同?

    我似乎有不同的方法 严格平等 检查undefined if something undefined if typeof something undefined if something void 0 可能还有其他人 In a 幸福的场景他们
  • Arduino:连接字符串时崩溃和错误

    我尝试将 AES 256 加密的输出连接到一个字符串 将此字符串与从 Android 手机发送的加密字符串进行比较 基本上 连接似乎有效 但在几次运行后会出现错误 不可读的字符 字符串变得更短而不是更长 或崩溃 它是可重现的 重启后在同一点
  • Youtube Iframe:未调用 onYouTubePlayerAPIReady()

    我有一个带有 iframe 的页面 它加载 youtube 视频 iframe 的 src 在运行时修改 我基于 Rob W 在该主题的不同答案中提供的代码 然后 当加载 iframe 时 执行以下代码 browser load funct
  • 每行的快速列洗牌 numpy

    我有一个包含行的长度超过 10 000 000 的大型数组 我需要单独洗牌这些行 例如 1 2 3 1 2 3 1 2 3 1 2 3 to 3 1 2 2 1 3 1 3 2 1 2 3 我目前正在使用 map numpy random
  • 在 UITextfield 中放置“清除按钮”

    有没有办法定位清除按钮 我想将其向下移动一点 使其与文本输入处于同一水平 有任何想法吗 我的文本字段已经是处理效果的另一个类的子类 包含 clearButtonRect 函数不起作用 IBDesignable open class Hosh
  • 有人可以解释一下这个 C# lambda 语法吗?

    我最近发现了一个静态方法 声明为 public class Foo public static Func
  • SQL Server 排序规则

    我正在读的书上说 SQL Server 支持两种字符数据类型 常规和 Unicode 常规数据类型包括 CHAR 和 VARCHAR Unicode 数据类型包括 NCHAR 和 NVARCHAR 不同之处在于 常规字符每个字符使用一个字节
  • Sinatra 是多线程的吗?

    Sinatra 是多线程的吗 我在其他地方读到 sinatra 默认情况下是多线程的 这意味着什么 考虑这个例子 get multithread do t1 Thread new puts sleeping for 10 sec sleep