如何在Ruby中同时运行两个线程?

Arc*_*ath 3 ruby multithreading

有没有办法同时运行2个线程?

我想让我的应用程序运行其当前函数,然后调出另一个运行另一个函数的线程,它可以更改第一个线程中的变量.

Jör*_*tag 15

如果要同时运行两个线程,整个执行堆栈必须能够执行此操作.让我们从顶部开始:

  1. Ruby本身能够同时运行两个线程,没问题.但是,Ruby只是一种编程语言,即只是一堆规则.为了运行您的程序,您需要一个Ruby 实现.不幸的是,许多流行的Ruby实现无法同时运行多个线程,包括MRI,YARV和Rubinius.事实上,唯一可以同时运行线程的生产就绪的Ruby实现是JRuby.(IronRuby也是,但这在技术上还没有生产就绪,尽管最终的1.0版本可能只有几天了.)
  2. 但是JRuby(和IronRuby)实际上并没有实现线程,它们只是使用底层平台的线程.即JRuby将Ruby线程映射到JVM线程,IronRuby将它们映射到CLI线程.因此,底层平台也必须能够并行运行线程.
  3. 同样:JVM和CLI原则上都能够并行运行线程,但JVM和CLI只是规范,它们只是纸上谈兵.为了运行代码,您需要实现这些规范,并非所有规范支持真正的并发线程.
  4. 甚至如果你的平台实现支持真正的并发线程,他们可能自己委托自己的线程实现对底层操作系统,就像JRuby的委托给JVM.例如,.NET,Mono,HotSpot和JRockit(分别是CLI和JVM的最流行的实现)使用本机OS线程作为其平台线程.因此,显然,操作系统必须能够并行运行线程.而且:并非所有人都是.
  5. 当然,如果只有一个CPU,操作系统中的所有并行性都无济于事.如果要同时运行两个线程,则需要两个CPU,两个内核或两个同时发生的硬件线程.

  • "如果你只有一个CPU,操作系统中的所有并行性都无济于事" - 值得注意的是,线程可以(我不愿意这么说)使得任务的编程变得更简单,即使它们不是真正并行运行.如果代码本身不需要处理任务切换,则有许多情况可以更清楚地表达"正在做什么".一个例子是UI线程和工作线程,它们在OS之间进行切换,即使它不同时运行. (4认同)

Mac*_*tka 3

http://ruby-doc.org/core/classes/Thread.html

x = 2
Thread.new do
    x = 3
end
x = 4
Run Code Online (Sandbox Code Playgroud)

对于真正的并发,需要有超过 2 个内核或 2 个处理器 - 但如果实现是单线程的(例如 MRI),它可能不起作用。