gpt4 book ai didi

ruby - 为什么一个 Ruby 程序/进程会产生多个线程?

转载 作者:数据小太阳 更新时间:2023-10-29 08:21:52 24 4
gpt4 key购买 nike

正如标题所说,为什么一个 Ruby 程序或进程会产生多个线程?

例如,如果我运行一个像这样的简单程序:

ruby -e 'while true; end'

然后尝试计算这个程序正在使用的线程数,方法是运行:

ps -o nlwp `echo $(ps aux | pgrep ruby)`

我得到输出:

NLWP

2

这意味着该进程正在使用两个线程。

我在 Linux 上使用 CRuby/YARV 2.5.3。我也在 2.3.8 中尝试过,得到了相同的结果。

编辑

对于 Ruby 2.6.0,它似乎只运行一个线程。但是,当我使用 --jit 选项启用 JIT 时,它会生成两个线程。

最佳答案

您没有说明您使用的是哪种 Ruby 实现,所以我们只能猜测:

  • 一些 Ruby 实现使用单独的线程进行 I/O。
  • 一些 Ruby 实现有一个并发垃圾收集器,即垃圾收集器在一个单独的线程中与 mutator 一起运行。
  • 一些 Ruby 实现具有并行垃圾收集器,即使用多个线程的垃圾收集器。
  • 一些 Ruby 实现有一个并发并行垃圾收集器,即垃圾收集器在多个单独的线程中与 mutator 一起运行。
  • 某些 Ruby 实现具有并发 JIT 编译器,即在单独的线程中与解释器一起运行的 JIT 编译器。
  • 某些 Ruby 实现具有并行 JIT 编译器,即使用多线程的 JIT 编译器。
  • 一些 Ruby 实现具有并发并行 JIT 编译器,即在多个独立线程中与解释器一起运行的 JIT 编译器。
  • 一些 Ruby 实现使用多个消息传递 VM 实现并发,即它们在单独的线程中为每个 CPU 核心运行一个 VM 实例,并通过在这些 VM 之间传递它们来实现 Ruby 线程、纤程等。
  • 一些 Ruby 实现使用单独的线程来实现跟踪和统计。
  • 某些 Ruby 实现本身可能运行在另一个运行时之上,它可以执行上述任何一项操作。

可能还有很多其他原因。

例如,YARV 2.6 在没有 JIT 的情况下运行时将使用 2 个线程(引擎和 I/O),而在使用 JIT 运行时将使用三个(加上 JIT)。

关于ruby - 为什么一个 Ruby 程序/进程会产生多个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53932171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com