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 在线程中的循环中休眠的主要内容,如果未能解决你的问题,请参考以下文章
如何使用信号调用同一进程中的另一个线程在轮询函数上休眠的进程而不杀死它?