Ruby VM并发性和并行性

时间:2011-11-09 11:52:58

标签: ruby concurrency parallel-processing scalability multiprocessing

我对Ruby VM(Ruby解释器)有一个普遍的疑问。它如何与多处理器一起使用?关于Ruby中的并行性和并发性,假设我有4个处理器。 VM是否会通过内核自动为处理器分配任务?通过扩展,可以说我的ruby进程占用了大量的CPU资源;如果添加新处理器会发生什么? OS是否负责将任务分配给处理器,或者每个VM是否在一个处理器上运行?扩展我的ruby应用程序的最佳方法是什么?我尽可能地分离我的进程并使用amqp队列。还有其他想法吗?

如果您可以向我发送链接以获取更多解释,那就太棒了。

提前致谢。

1 个答案:

答案 0 :(得分:6)

Ruby Threading

Ruby语言本身通过线程模型支持并行执行;但是,实现决定了是否使用了额外的硬件资源。 “黄金标准”解释器(MRI Ruby)在1.8中使用“绿色线程”模型;线程在解释器中完成,仅使用单个系统线程执行。但是,其他人(例如JRuby)利用Java VM创建实际的系统级线程以供执行。 MRI Ruby 1.9增加了额外的线程功能,但是(afaik)它仍然仅限于在线程在I / O事件上停顿时切换线程上下文。

高级线程

通常,OS管理线程到逻辑核心的分配,因为大多数应用软件实际上并不关心。在某些高性能计算案例中,该软件将专门请求某些线程在特定逻辑内核上执行,以实现体系结构特定性能。用Ruby编写的任何内容都不太可能属于这一类。

重构

每个应用程序性能限制通常可以通过首先重构代码来解决。利用更适合特定问题的语言或其他环境可能是最好的第一步,而不是立即跳转到现有实现中的线程。

实施例

我曾经在一个Ruby on Rails应用程序上工作,当数据上传时,其中有一个大规模的哈希映射函数步骤。最初的实现完全是用Ruby编写的,需要大约80秒才能完成。重写ANSI C中的代码并利用更具体的内存分配,执行时间降至不到一秒(甚至没有使用线程)。下一个瓶颈是将大量数据插回到MySQL中,最终还将其移出Ruby代码并转换为线程化C代码。我特意选择了这条路线,因为MRI Ruby解释器很容易绑定到C代码。最后的结果是Ruby为C代码准备了环境,在带有参数的类上调用它作为Ruby实例方法,通过单个C代码线程进行哈希映射,最后用OpenMP工作队列模型完成生成并执行插入MySQL。