Ruby 在线程中的循环中休眠

Posted

技术标签:

【中文标题】Ruby 在线程中的循环中休眠【英文标题】:Ruby Sleep in a Loop in Thread 【发布时间】:2011-04-26 15:54:15 【问题描述】:

一年前我在这里发布了完全相同的问题: Ruby Loop Failing in Thread

这里是代码(与上面的主题几乎相同)

 class NewObject
    def my_funk
        t = Thread.new 
            until false do
                puts sleep 15 # sleeps way too much
            end
        
        t.join
  end
end

if __FILE__ == $0
    s = NewObject.new()
    s.my_funk
end

这是输出:

15
42
36
38
33
45
42
33
32
40

代码基本上打印了实际的睡眠秒数。 有谁知道这里发生了什么以及如何解决它?

我正在运行 Windows 7 和 Ruby 1.8.7

【问题讨论】:

不知道这里发生了什么,但代码在 Windows 7 上使用 JRuby 1.5.3 可以正常工作。 它也适用于 Win7 上的 Ruby 1.9。我想我得更新我的红宝石了。 你有 puts sleep 15,它应该只是 sleep 15 没有 puts... @Nick, sleep 返回实际的睡眠秒数,因此“puts sleep 15”将尝试睡眠 15 秒,然后显示睡眠了多少秒。 【参考方案1】:

如果我没记错的话,sleep 是使用本机系统调用实现的,并且可能会干扰由 VM 管理的 ruby​​ green 线程。这也可以解释为什么 JRuby 和 1.9 不会遇到同样的问题....

【讨论】:

以上是关于Ruby 在线程中的循环中休眠的主要内容,如果未能解决你的问题,请参考以下文章

RunLoop的学习总结

如果线程生成速度过快,Ruby 工作分配会失败

如何在线程休眠期间每尝试一定次数后记录错误?

如何使用信号调用同一进程中的另一个线程在轮询函数上休眠的进程而不杀死它?

C# 中的 Thread.Sleep():它是让实例化对象的线程休眠,还是让我从中调用方法的线程休眠?

time.sleep -- 休眠线程或进程?