【问题标题】:Does my ruby thread code will run in parallel automatically when use jRuby使用 jRuby 时,我的 ruby​​ 线程代码是否会自动并行运行
【发布时间】:2017-07-31 22:01:22
【问题描述】:

我有这个代码

require 'thread'
work_q = Queue.new
(0..50).to_a.each{|x| work_q.push x }
workers = (0...4).map do
  Thread.new do
    begin
      while x = work_q.pop(true)
        50.times{print [128000+x].pack "U*"}
      end
    rescue ThreadError
    end
  end
end
workers.map(&:join)

我知道如果我使用 MRI 运行,它只会同时运行。

但是如果我在 jRuby 上运行它,它会同时并行运行,还是仅仅同时运行

在jRuby上使用java编写线程代码来实现并行处理是不是必须的?

【问题讨论】:

    标签: ruby multithreading jruby


    【解决方案1】:

    简而言之,是的,它将是并行的。 jruby 附带了一个用本机 java 编写的自定义线程库,因此当您将 require 'thread' 放在文件顶部时,您实际上使用的是 java 库,而不是 ruby​​ 库。

    只要您的 java 安装支持并行线程(大多数现代的都支持),并且只要您的操作系统支持并行线程(大多数现代的都支持),那么您的 jruby 代码也有可能并行运行.

    【讨论】:

    • 不错。很高兴知道这一点。还有一个问题。我们如何证明它是并行运行的。
    • @SunuPinasthikaFajar 如果您使用的是 Windows,您可以打开任务管理器,转到性能选项卡,右键单击并选择 Change Graph to > Logical processors。这将允许您监视所有处理器内核,以查看您的代码是在所有内核上运行还是在其中一个内核上运行。
    • 如果您使用的是 Linux,您可以使用 htop 命令查看您的进程在哪些内核上运行。
    • “Java 线程是本地系统线程的包装器,因此它们是开箱即用的并行。” ——那不是真的。 1)您暗示本机线程是自动并行的,而绿色线程不是。那是错误的。例如。 YARV 线程也是“本地系统线程的包装器”,它们并行,而 BEAM 的线程是绿色线程,但并行。 2) Java 语言规范中没有任何保证说明线程是如何实现的,也没有说明它们是否是并行的。用…来实现 Java 是完全有效的。
    • …非并行线程,用绿色线程实现Java是完全有效的,有绿色线程Java实现,非并行线程Java实现,和两个都。事实上,Sun 的 Java 实现曾经就是其中之一。 3) 即使如果 Java 线程被实现为本地系统线程,本地系统线程完全有可能是并行的。有很多操作系统上的线程不是并行的。 4) 即使 如果 你的操作系统有并行线程,它们仍然只能在你有多个 CPU 的情况下并行执行。有很多……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    相关资源
    最近更新 更多