首页 / 知识
红宝石有真正的多线程吗?
2023-04-14 22:50:00
Does ruby have real multithreading?我知道使用绿色线程的"红宝石""合作"线程。 如何在应用程序中创建真正的" OS级"线程,以便利用多个cpu内核进行处理? 更新为J?rg 2011年9月的评论 好。
您似乎在这里混淆了两个截然不同的事情: 好。
(不幸的是,这11个实现中只有两个是 好。
第一个实现实际上没有名称, 好。
有时也称为" MRI"(对于" Matz's Ruby 好。
MRI在其内部将Ruby线程实现为绿色线程 好。
但是,可以运行任何数量的C线程(POSIX线程等)。 好。
第二种实现是YARV("还"的缩写 好。 像MRI一样,C线程实际上可以与Ruby线程并行运行。 好。
将来,GIL可能会损坏 好。
JRuby将Ruby线程实现为本机线程, 好。 XRuby还将Ruby Threads实现为JVM Threads。更新:XRuby已死。 好。
IronRuby将Ruby线程实现为本地线程, 好。
Ruby.NET也将Ruby线程实现为CLR 好。
Rubinius将Ruby线程实现为绿色线程 好。
Rubinius无法(当前)并行调度线程, 好。 更新:此答案中有关Rubinius的信息是关于Shotgun VM的,它不再存在。"新" C ++ VM不使用跨多个VM调度的绿色线程(即Erlang / BEAM样式),它使用具有多个本机OS线程模型的更传统的单个VM,就像CLR,Mono所采用的那样,几乎每个JVM。 好。
MacRuby最初是YARV的端口, 好。
Cardinal是鹦鹉的Ruby实现 好。
MagLev是GemStone / S的Ruby实现 好。
HotRuby不是其完整的Ruby实现 好。
不幸的是,这11个Ruby实现中只有两个是 好。
因此,如果您想要真正的并行线程,那么JRuby当前是您的 好。
否则,"经典" Ruby解决方案是使用进程 好。 好。 Ruby 1.8仅具有绿色线程,无法创建真正的" OS级"线??程。但是,ruby 1.9将具有称为纤维的新功能,该功能将允许您创建实际的OS级线程。不幸的是,Ruby 1.9仍处于beta中,计划在几个月内保持稳定。 另一种选择是使用JRuby。 JRuby将线程作为操作系统级别的主题实现,其中没有"绿色线程"。 JRuby的最新版本是1.1.4,并且等效于Ruby 1.8 这取决于实现:
Ruby的闭包为 请注意,能够创建真正的" OS级"线??程并不意味着您可以使用多个cpu内核进行并行处理。看下面的例子。 这是一个简单的Ruby程序的输出,该程序在Ruby 2.1.0中使用3个线程:
如您所见,有四个OS线程,但是只有状态为 相同的程序,现在与JRuby一起使用。您可以看到状态为
相同的程序,现在使用MacRuby。还有三个线程并行运行。这是因为MacRuby线程是POSIX线程(真正的" OS级"线??程),并且没有GVL
再次,相同的程序,但现在具有良好的旧MRI。由于此实现使用绿色线程,因此仅显示一个线程
如果您对Ruby多线程感兴趣,您可能会发现我的报告"使用fork处理程序调试并行程序"很有趣。 如何使用drb?它不是真正的多线程,而是多个进程之间的通信,但是您现在可以在1.8中使用它,并且摩擦很小。 我将让"系统监视器"回答这个问题。在两种情况下,我都使用在i7(4个超线程核心)计算机上运行的8个Ruby线程执行相同的代码(下面将计算质数)...第一次运行是:
jruby 1.5.6(ruby 1.8.7补丁程序级别249)(2014-02-03 6586) 第二个是: 红宝石2.1.2p95(2014-05-08)[x86_64-linux-gnu] 有趣的是,对于JRuby线程,CPU较高,但是对于解释后的Ruby,完成时间略短。从图中很难看出来,但是第二次(解释为Ruby)运行使用了大约1/2个CPU(没有超线程?)。
由于无法编辑该答案,因此请在此处添加新的回复。 更新(2017-05-08)
这篇文章很旧,并且信息不是最新的
Opal是从Ruby到JavaScript的源到源编译器。它还有一个Ruby corelib的实现。它当前非常活跃,已经开发了,并且存在大量的(前端)框架。
truffleruby是Ruby编程语言的高性能实现。 TruffleRuby是Oracle Labs在GraalVM上构建的,它是JRuby的分支,将其与Rubinius项目的代码结合在一起,还包含来自Ruby,MRI的标准实现的代码,仍在现场开发中,尚未投入生产。 这是有关Rinda的一些信息,它是Linda的Ruby实现(并行处理和分布式计算范例)http://charmalloc.blogspot.com/2009/12/linda-tuples-rinda-drb-parallel.html
如果您确实需要在Ruby中为生产级系统(不能使用Beta)进行并行处理,则处理可能是一个更好的选择。 另外,如果您对将来在Ruby下进行线程化感兴趣,则可能会发现本文很有用。 如果您正在使用MRI,则可以将C中的线程代码作为扩展名或使用ruby-inline gem编写。 |
最新内容
相关内容
linux系统内核命令?
linux系统内核命令?,信息,系统,工作,工具,电脑,软件,管理,设备,内核,发展,如何查看已安装的Linux内核请在mirrors/里找一个合适的下载点,再到pulinux线程查询命令?
linux线程查询命令?,系统,第一,线程,命令,软件,名称,信息,进程,选项,方法,Linux系统如何查看进程的线程数1、第一种方法:top命令法首先执行toplinux多线程下载命令?
linux多线程下载命令?,软件,工具,平台,中心,系统,代理,网络,网站,手机,官方网站,从linux服务器中下载或上传文件wget是linux下一个从网络上自linux断开线程命令?
linux断开线程命令?,系统,状态,工作,代码,线程,入口,网络,管理,名称,命令,linux下C中怎么让才能安全关闭线程方法:在线程入口函数中,调用returnlinux显示内核命令?
linux显示内核命令?,地址,发行,信息,工具,电脑,系统,名称,内核,版本,状态,如何查看linux内核版本1、uname查看linux内核版本 最常用 的命令,适linux停止线程的命令?
linux停止线程的命令?,系统,软件,代码,产品,进程,第一,管理,生产,通信,工具,linux下nginx停止命令1、首先,连接相应linux主机,进入到linux命令行linux超线程查看命令?
linux超线程查看命令?,系统,第一,信息,软件,命令,数据,工具,实时,界面,个数,Linux查看CPU详细信息这里我先介绍一个文件。它就是/proc目录文件linux查看多线程命令?
linux查看多线程命令?,系统,第一,线程,地址,数据,进程,命令,名称,软件,情况,如何查看linux服务器的cpu数量,内核数,和cpu线程数如何查看linuxlinux执行线程命令?
linux执行线程命令?,系统,工作,线程,软件,服务,管理,信息,环境,名称,命令,linux下线程属性常用操作有哪些1、linux系统常用操作命令linux系统linux内核发行版命令?
linux内核发行版命令?,发行,系统,地址,软件,设备,信息,内核,版本,工具,公司,linux版本的发行版和内核版是什么意思1、linux发行版,就是在内核的加载linux内核的命令?
加载linux内核的命令?,系统,信息,地址,电脑,发行,设备,简介,平台,发展,基础,linux开机启动会依次加载哪些脚本?一般的/etc/rc.d/init.d/目录下linux内核配置的命令?
linux内核配置的命令?,系统,工作,管理,地址,时间,命令,信息,设备,目录,内核,一般优化linux的内核,需要优化什么参数1、Linux内核参数优化/etc/