ruby 有真正的多线程吗?

2024-02-24

我知道 ruby​​ 使用的“协作”线程绿线 http://en.wikipedia.org/wiki/Green_threads。如何在应用程序中创建真正的“操作系统级”线程,以便利用多个 cpu 核心进行处理?


更新了 Jörg 2011 年 9 月的评论

你似乎混淆了两个very这里有不同的东西: Ruby 编程语言及其具体的线程模型之一 Ruby 编程语言的具体实现。那里 目前大约有 11 种不同的 Ruby 实现 编程语言,与very不同且独特的螺纹 楷模。

(不幸的是,这 11 个实现中只有两个实际上是 已准备好投入生产使用,但到今年年底这个数字 可能会增加到四到五个。)(Update:现在有 5 个:MRI、JRuby、YARV(Ruby 1.9 的解释器)、Rubinius 和 IronRuby)。

  1. 第一个实现实际上没有名称, 让人很尴尬地引用它,而且真的很烦人 令人困惑。它最常被称为“Ruby”,甚至 比没有名字更烦人、更令人困惑,因为它 导致 Ruby 的特性之间无休无止的混淆 编程语言和特定的 Ruby 实现。

有时也称为“MRI”(“Matz 的 Ruby”) 实现”)、CRuby 或 MatzRuby。

MRI 在其内部将 Ruby 线程实现为绿色线程 口译员 http://RedMine.Ruby-Lang.Org/repositories/annotate/ruby-18/ext/thread/thread.c。不幸的是,它不允许这些线程 要并行调度,它们只能同时运行一个线程 时间。

但是,可以运行任意数量的 C 线程(POSIX 线程等) 与 Ruby 线程并行,因此外部 C 库或 MRI 创建自己的线程的 C 扩展仍然可以在 平行线。

  1. 第二个实现是YARV http://WWW.AtDot.Net/yarv/(“然而 另一个 Ruby VM”)。YARV 将 Ruby 线程实现为 POSIX 或 Windows NT 线程 http://RedMine.Ruby-Lang.Org/repositories/annotate/ruby-19/thread.c,但是,它使用全局解释器 锁定(GIL)以确保实际上只有一个 Ruby 线程可以 安排在任何一个时间。

像 MRI、C 线程can实际上与 Ruby 线程并行运行。

未来,GIL 有可能might被打破 进入更细粒度的锁,从而允许越来越多的 代码实际上是并行运行的,但那是很遥远的事情, 甚至不planned yet.

  1. JRuby https://www.jruby.org/ 将 Ruby 线程实现为本机线程 http://www.restlessprogrammer.com/2013/02/multi-threading-in-jruby.html, 其中 JVM 中的“本机线程”显然意味着“JVM 线程”。JRuby 没有对它们强加额外的锁定。所以, 这些线程是否实际上可以并行运行取决于 JVM:有些 JVM 将 JVM 线程实现为操作系统线程,有些则将 作为绿色线程。 (Sun/Oracle 的主流 JVM 自 JDK 1.3 起仅使用操作系统线程)

  2. XRuby http://XRuby.GoogleCode.Com/ also 将 Ruby 线程实现为 JVM 线程 http://Code.Google.Com/p/xruby/source/browse/trunk/src/com/xruby/runtime/builtin/RubyThread.java#21. Update:XRuby 死了。

  3. IronRuby http://IronRuby.Net/ 将 Ruby 线程实现为本机线程 http://IronRuby.RubyForge.Org/svn/trunk/src/IronRuby.Libraries/Builtins/ThreadOps.cs, 对于 CLR,“本机线程”显然意味着 “CLR 线程”。 IronRuby 没有对它们强加额外的锁定, 所以,只要你的 CLR 支持,它们就应该并行运行 那。

  4. Ruby.NET http://RubyDotNetCompiler.GoogleCode.Com/ also 将 Ruby 线程实现为 CLR 线程数 http://Code.Google.Com/p/rubydotnetcompiler/source/browse/trunk/src/RubyRuntime/Built-in%20Classes/Thread.cs#21. Update:Ruby.NET 已死。

  5. Rubinius http://Rubini.us/ 将 Ruby 线程实现为绿色线程 在其虚拟机内 https://GitHub.Com/EvanPhx/Rubinius/tree/master/kernel/core/thread.rb#L9。更准确地说:鲁比尼乌斯 VM导出非常轻量,非常灵活 并发/并行/非本地控制流构造,称为 A ”Task https://GitHub.Com/EvanPhx/Rubinius/tree/cpp/vm/builtin/task.cpp”,以及所有其他并发结构(线程中 这次讨论,还延续 https://GitHub.Com/EvanPhx/Rubinius/tree/master/kernel/core/continuation.rb#L45, Actors https://GitHub.Com/EvanPhx/Rubinius/tree/master/lib/actor.rb#L31和 其他东西)都是使用任务在纯 Ruby 中实现的。

Rubinius 无法(当前)并行调度线程, 然而,补充一下这并不是什么大问题:鲁比尼乌斯可以 已经在多个 POSIX 线程中运行多个 VM 实例 平行线 https://GitHub.Com/EvanPhx/Rubinius/tree/master/kernel/core/vm.rb#L5,在一个 Rubinius 过程中。由于线程是 实际上是用 Ruby 实现的,它们可以像任何其他 Ruby 一样 对象,被序列化并发送到不同VM中的不同 POSIX 线程。 (与 BEAM 相同型号Erlang http://Erlang.Org/虚拟机 用于 SMP 并发。已经是实施用于 鲁比纽斯 演员 https://GitHub.Com/EvanPhx/Rubinius/tree/master/lib/vmactor.rb.)

Update:此答案中有关 Rubinius 的信息是关于 Shotgun VM 的,该 VM 已不存在。 “新”C++ VM 不使用跨多个 VM 调度的绿色线程(即 Erlang/BEAM 风格),它使用更传统的具有多个本机操作系统线程模型的单个 VM,就像 CLR、Mono 使用的模型一样,以及几乎所有 JVM。

  1. MacRuby http://MacRuby.Org/最初是 YARV 的一个港口,位于 Objective-C 运行时、CoreFoundation 和 Cocoa 框架。它 现在与 YARV 明显不同,但据我所知目前 仍然与 YARV 共享相同的线程模型 http://MacRuby.Org/trac/browser/MacRuby/trunk/thread.c?annotate=blame. Update:MacRuby 依赖于苹果垃圾收集器,该垃圾收集器已被声明弃用,并将在 MacOSX 的后续版本中删除,MacRuby 是不死的。

  2. Cardinal https://github.com/parrot/cardinal是一个 Ruby 实现鹦鹉 虚拟机 http://ParrotCode.Org/。然而,它还没有实现线程, 当它发生时,它可能会将它们实现为鹦鹉 线程数 http://SVN.Perl.Org/viewvc/parrot/trunk/src/thread.c?view=annotate. Update:红衣主教看起来非常不活跃/死气沉沉。

  3. MagLev http://MagLev.GemStone.Com/是一个 Ruby 实现宝石/S Smalltalk虚拟机 http://GemStone.Com/products/smalltalk/。我不知道什么线程模型 GemStone/S 使用什么线程模型 MagLev 使用什么线程模型或者即使 线程甚至还没有实现(可能还没有)。

  4. HotRuby http://HotRuby.Yukoba.Jp/ is not其完整的 Ruby 实现 自己的。它是 YARV 字节码 VM 的实现 JavaScript。 HotRuby 还不支持线程(还?),什么时候支持 确实,它们将无法并行运行,因为 JavaScript 不支持真正的并行性。有一个动作脚本 然而,HotRuby 版本和 ActionScript 实际上可能 支持并行。Update:HotRuby 死了。

不幸的是,这 11 个 Ruby 实现中只有两个是 实际上已做好生产准备:MRI 和 JRuby。

因此,如果您想要真正的并行线程,JRuby 目前是您的选择 唯一的选择 – 这并不是一个坏选择:JRuby 实际上更快 比 MRI 更稳定。

否则,“经典”Ruby 解决方案是使用进程 而不是线程来实现并行性。 Ruby 核心库 包含Process module http://Ruby-Doc.Org/core/classes/Process.htmlProcess.fork method http://Ruby-Doc.Org/core/classes/Process.html#M003179这使得分叉另一个 Ruby 变得非常容易 过程。此外,Ruby 标准库还包含分布式 Ruby (dRuby / dRb) http://Ruby-Doc.Org/stdlib/libdoc/drb/rdoc/库,它允许 Ruby 代码可以轻松地分布在多个进程中,而不是 不仅在同一台机器上,而且还可以跨网络。

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

ruby 有真正的多线程吗? 的相关文章

  • Java 中的 LRU 缓存实现

    我看过下面的代码 我认为addElement方法的实现中有一个无用的while循环 它永远不应该有比 size 1 更多的元素 因为已经有一个写锁 那么为什么 addElement 方法会删除元素直到它达到这个条件 真的 while con
  • ArrayDeque 和 LinkedBlockingDeque

    只是想知道为什么他们做了一个LinkedBlockingDeque而同一个非并发对应物是ArrayDeque它基于可调整大小的数组 LinkedBlockingQueue使用一组节点 例如LinkedList 尽管没有实施List 我知道可
  • Ruby 中 SecureRandom.urlsafe_base64(8) 的碰撞概率?

    我在用SecureRandom urlsafe base64 8 为了在我的系统中创建 URL 安全的唯一 ID 我想知道如何计算碰撞概率 我将大约 10 000 个这些 id 插入到一个数组中 我想避免检查其中一个键是否已经在数组中 但我
  • Rails 5.2 Active Storage 添加自定义属性

    我有一个带有附件的模型 class Project lt ApplicationRecord has many attached images end 当我附加并保存图像时 我还想保存一个附加的自定义属性 display order 整数
  • 在 Windows 上安装 RMagick

    我对此进行了研究 并且在我的一台计算机上花了几个小时 大约三周前 我在我的台式计算机上安装了 RMagick 它相当复杂 我不记得我采取的具体步骤 我真的很沮丧 我已将 ImageMagick 安装到我的计算机上的目录 C ImageMag
  • 使用自定义 gem 在 Dreamhost/Passenger 上部署 Sinatra 应用程序

    我有一个 Sinatra 应用程序 正在尝试在 Dreamhost 上运行 该应用程序利用 pony 发送电子邮件 为了让应用程序从一开始就启动并运行 在添加小马之前 我必须gem unpack rack and gem unpack si
  • Time 方法在另一个线程中执行并在超时时中止

    您好 我正在尝试异步运行方法 以便计算持续时间并在超过超时时取消该方法 我尝试使用异步和等待来实现这一点 但没有运气 也许我过度设计了这个 任何输入都会受到赞赏 应该注意的是 我无法更改接口 TheirInterface 因此得名 到目前为
  • Accepts_nested_attributes_for Rails 3 中的实际形式使用

    使用 Ruby on Rails 3 我半明白accepts nested attributes for是如何的supposed工作 但我无法找出以某种形式实现这一点的实用方法 例如 如果有人想在其用户页面中添加他们最近的位置 user r
  • Android 上的多处理

    我一直在 Android 上执行一些测试 以验证并行化算法 如 FFT 的性能可以提高多少 我通过使用带有 JNI FFTW 的 pthread 和 Java 线程 来自 JTransforms 来实现这些算法 我没有像预期那样通过使用线程
  • 何时何地调用 EventQueue.invokeLater() 方法

    我对线程和 GUI 完全陌生 因此我不知道在哪里调用它EventQueue invokeLater 方法 我应该在每个事件监听器和其他东西中调用它吗 调用这个方法的 东西 是什么 如果是这样 是否有任何替代方法来调用一次应用到处方法 以便不
  • 从ndk中的不同线程调用java方法

    我正在尝试使用 android 的 NDK 从 C 中的独立线程调用 java 静态方法 到目前为止我已经 JNIEnv env AttachJava jclass cls2 env gt FindClass com actvt showd
  • sinatra 应用程序在运行时无法启动

    我使用的是 Ubuntu 10 10 Ruby 1 9 2 无论我做什么 我都无法在本地计算机上启动 sinatra 应用程序 你好 rb require sinatra get do Hello World end ruby hello
  • 如何将 STDOUT 捕获到字符串?

    puts hi puts bye 我想存储到目前为止代码的 STDOUT 在本例中 hi nbye 到变量中说 结果 并打印它 puts result 我这样做的原因是我已将 R 代码集成到我的 Ruby 代码中 当 R 代码运行时 其输出
  • 查找数组中 2 个缺失数字的最快方法

    这个问题的存在只是出于纯粹的好奇心 不是作业 找到在数组 1 n 中找到两个缺失数字的最快方法 因此 在相关帖子中 查找数字数组中缺失数字的最快方法 https stackoverflow com questions 2113795 qui
  • java:为什么主线程等待子线程完成

    我有一个简单的java程序 主线程 main 创建并启动另一个线程t class T extends Thread Override public void run while true System out println Inside
  • C# 为所有对象订阅相同的事件处理程序是线程安全的吗

    我的项目中有一种情况 我连接到多个服务器并监听事件 每当从服务器接收到事件时 Handler 就应该将该事件添加到公共队列中进行处理 所有连接都应将接收到的事件添加到队列中 foreach var item in collection Co
  • Boost:如何创建一个线程以便可以控制它的所有标准输出、标准错误?

    我用 C 创建了一个 win32 控制台应用程序 我使用一些API 不是我的 我不能修改它的来源 它是这样写的 它会将一些信息写入控制台屏幕 而不询问 每次我调用它时 每秒 48 次 所以我想将它放入某个线程并限制其输出能力 但我需要得到当
  • 使用 Ruby 通过 Outlook 发送消息的最简单方法是什么?

    我的工作要求我为某些测试自动生成电子邮件 我一直在四处寻找 但一直未能找到可以快速实施的合理解决方案 它需要在 Outlook 中 而不是其他邮件服务器中 因为我们有一些奇怪的身份验证规则 并且我们需要保存草稿的选项 而不仅仅是发送消息 显
  • 如果数组包含一个或多个相同值,则合并数组

    我有一个数组数组 a 1 2 3 3 4 5 6 7 8 8 9 9 10 我想合并包含一个或多个相同值的所有数组 所以 a 1 2 3 4 5 6 7 8 9 10 我正在努力寻找一种简洁的方法来解决这个问题 有任何想法吗 我相信这是正确
  • Ruby:基于控制台的菜单

    我有一个名称和 URL 数组 并希望以向上 向下滚动菜单的形式向用户呈现名称列表 基本上是什么dialog允许在外壳内 我调查过ncurses ruby rdialog and HighLine但它们似乎要么作为一个项目被放弃 要么甚至从它

随机推荐

  • Onclick 不触发

    我的母版页上有一组按钮 我已附加下面的代码 但没有引发 onclick 事件 我提取了最终页面源代码 但没有出现 onclick 事件 正如你所看到的 我尝试了几种不同的方法来解决这个问题 我正在寻找到服务器的正常回发 但当我单击这些按钮中
  • 使用 JSONpath 从 JSON 文件中提取叶子

    我有来自 REST API 的 JSON 输出 输出如下所示 sprints id 10516 sequence 10516 name SP121 BRK relief state CLOSED linkedPagesCount 0 id
  • Ansible:regex_search 过滤器比较以及如何调试 when 子句

    今天我花了一些时间尝试编写一些 Ansible 脚本 以便仅在相关命令输出中不存在相应行的情况下运行命令 经过一番尝试和错误后 我得到了一些对我有用的东西 但我不清楚为什么我与空字符串的初始比较不起作用 这是一个演示我的问题的剧本 name
  • 计算二进制数字范围内 1 的数量的算法

    所以我刚回来ACM 编程竞赛表现还不错 但有一个问题没有一支球队能解决 问题 从大于 0 的整数 N0 开始 令 N1 为 N0 的二进制表示形式中 1 的数量 因此 如果N0 27 N1 4 对全部i gt 0 令 Ni 为二进制表示中
  • java中的wav幅度(立体声或更多通道)

    大家好 有谁知道如何用 Java 查找 WAV 文件中的幅度吗 如果文件是立体声的 或有更多通道 如何将数据放入数组中 Thanks 处理 WAV 文件头 https ccrma stanford edu courses 422 winte
  • 将应用程序包上传到 Google Play 控制台时出现有关“AD_SERVICES_CONFIG”的错误

    详细的错误消息如下 任何想法 非常感谢 Your app is not allowed to specify AD SERVICES CONFIG property in the manifest 我尝试向清单添加权限 但仍然遇到相同的错误
  • Angular 4 数组验证

    我需要帮助formArray验证在反应形式 我想验证数组中的每个项目 但我不知道该怎么做 谢谢 html代码
  • JS - 合并至少共享一个共同值的数组

    如果我有以下数组 var myArr 0 1 2 1 2 6 9 10 10 11 11 12 13 如何合并至少共享一个公共值的数组以产生以下输出 var myMergedArr 0 1 2 6 9 10 11 12 13 Thanks
  • 使用 Gson 将单键值转为 Json

    我有一个键值对 需要使用 Gson 将其转换为 Json 我该怎么做呢 说我有 class MyClass String key String value bunch of other fields public String single
  • 如何在 Vista 中使用 SetWindowsHookEx 并通过 UAC 挂钩管理应用程序?

    我试图弄清楚是否有一种方法可以使用 SetWindowsHookEx 并能够影响在 Vista 上以管理员权限运行且启用了 UAC 的应用程序 这个应用程序需要向其他窗口的标题栏添加一个小按钮 以启用一些多显示器感知处理 我本以为这是不可能
  • 自动映射器无法映射到 IEnumerable

    我有两个这样的课程 public class SentEmailAttachment ISentEmailAttachment public SentEmailAttachment public string FileName get se
  • matplotlib:figimage 未显示在 Jupyter 笔记本中

    我正在尝试以其真实尺寸渲染图像 未缩放或拉伸 使用 matplotlib 执行此操作的最简单方法似乎是figimage 但是 当我尝试在 Jupyter 笔记本中使用它时 该图没有显示 其他图显示良好 这似乎只影响figimage 正如您所
  • Android 构建错误:“未找到 lStar...”

    尝试在模拟器中构建我的应用程序后出现这样的错误 Users joel gradle caches transforms 3 06231cc1265260b25a06bafce7a4176f transformed core 1 7 0 al
  • 将二进制字符串转换为二进制或十进制值

    有没有什么函数可以将二进制字符串转换为二进制或十进制值 如果我有一个二进制字符串000101 我应该怎么做才能将其转换为5 你可以使用packBits函数 在base包裹 请记住 此功能需要非常具体的输入 yy lt intToBits 5
  • 如何使用 PHP 与 Google Analytics Data API (GA4) 结合使用多个过滤器

    所以这将是我在这里的第一个问题 我会尽力遵守社区规则 我正在尝试使用 PHP 在 Google Analytics Data API GA4 中使用多个过滤器 我已经成功地能够使用一个过滤器并将其显示在自定义仪表板中 下面是获取以值开头的
  • git 将提交消息存储在哪里

    我正在做一次提交 发现我犯了一个错误 由于关闭 nano 会提交更改 因此我强制关闭了终端 这将 swp 文件留在某处 阻止我将来提交 Error in nano malloc memory corruption fast 0x000000
  • 在我的应用程序中获取其他应用程序图标图像

    在我的应用程序中 我显示了应用程序商店中的一些应用程序列表 我想在我的应用程序中获取这些应用程序的图标图像 我只是搜索但没有得到任何相关的帖子 有什么办法可以得到吗 苹果允许获取吗 请问有什么办法吗 谢谢您的帮助 苹果有一个JSON服务为此
  • 在 AWS elastic beanstalk 上使用 webpacker gem 部署 Rails React 应用程序

    我正在尝试使用 AWS Elastic Beanstalk 部署使用 webpacker gem 创建的 Rails 5 1 React 应用程序 问题是我不断收到以下错误 Webpacker requires Node js gt 6 0
  • 如何确定客户端连接到 C 中的 INADDR_ANY 侦听器套接字所使用的 IP

    我有一个用 C 编写的网络服务器应用程序 侦听器使用 INADDR ANY 绑定 因此它可以通过安装它的主机的任何 IP 地址接受连接 我需要确定客户端在建立连接时使用哪个服务器的 IP 地址 实际上我只需要知道它们是否通过环回地址 127
  • ruby 有真正的多线程吗?

    我知道 ruby 使用的 协作 线程绿线 http en wikipedia org wiki Green threads 如何在应用程序中创建真正的 操作系统级 线程 以便利用多个 cpu 核心进行处理 更新了 J rg 2011 年 9