Saa*_*lik 9 ruby multithreading
在Ruby中,Thread#run和Thread#wakup有什么区别?
RDoc指定不使用Thread#wakeup调用调度程序,但这意味着什么?什么时候使用wakeup vs run?谢谢.
编辑:
我看到Thread#wakup导致线程变为可运行,但是如果在执行Thread#run之前它不会执行它会有什么用处(无论如何唤醒线程)?
有人可以提供一个醒来有意义的例子吗?出于好奇心的缘故=)
runRuby和Ruby之间的区别与wakeup文档中描述的完全一样,尽管没有提及 MRI/YARV 实现的细节。这是有道理的,因为 Ruby 的其他实现(例如 JRuby)使用“真实”线程。
在 Ruby 中,wakeup使线程可调度,但不会立即运行该线程。run也使线程可调度,但它立即运行线程。
在 MRI/YARV 上,最初可能看起来wakeup没有任何作用。这是因为 MRI/YARV 有一个 GVL(全局 VM 锁),它一次只允许一个线程在 Ruby VM 中运行,并且线程不会被传统意义上的抢占,而是运行直到它们放弃控制( 、Thread.pass等Kernel.sleep) .),遇到 I/O 等待或定时器线程引发中断标志。在所有情况下,线程调度程序都会恢复其他当前可运行的线程之一。因此,如果您调用wakeup或Thread.pass,然后导致 I/O 等待(例如gets),您将看到另一个线程正在执行。
在 MRI/YARV 上,如果只有两个线程,则Thread.run本质上相当于Thread.wakeup+ 。Thread.pass如果有更多线程,Thread.pass可能不一定启动被唤醒的线程,而是调度程序认为接下来应该运行的线程。这就是为什么该run方法是必要的,因为它既唤醒线程又立即运行它,而不将其留给调度程序。对于 Ruby 的所有实现都是如此,即使是那些具有“真实”线程的实现也是如此。