【问题标题】:High precision Sleep in Ruby [duplicate]Ruby中的高精度睡眠[重复]
【发布时间】:2012-10-27 18:03:09
【问题描述】:

可能重复:
Ruby sleep or delay less than a second?

我有 100-1000 个线程正在运行(或更多)。 这些线程中的每一个都应该在完全相同的时刻(尽可能准确)执行特定的方法。

我能想到的唯一解决方案是让每个线程为某个时间戳的差异而休眠,但是sleep() 并不那么准确。 我也在考虑改用EventMachineEventMachine::Timer,但这似乎更不可靠和准确。

你会使用什么技术来达到最好的效果?

【问题讨论】:

  • Stack Overflow 上的习惯做法是展示您为解决问题而编写的代码示例。这样,我们可以帮助您修复代码,而不是为您编写代码。照原样,您的问题可能会与“非建设性”或“不是真正的问题”审查员发生冲突。
  • 还指定使用的 Ruby 版本和线程模型。 Green 线程和 Native 线程之间是有区别的。虽然,最终时间和准确性(或缺乏)归结为调度程序和负载..
  • 线程是不是这里的理想方法?
  • 你不能用 ruby​​ 做你正在尝试的事情。至少在需要高精度的情况下。 Ruby 不适合实时应用程序并且不具备真正的线程并发性(有一个 GIL,Global Interpreter Lock,防止多个同时运行的线程同时运行 ruby​​ 代码)。
  • 只想提一下,从 1000 个线程“相同”的时间运行一种方法需要 1000 个硬件线程!!!

标签: ruby timer sleep precision


【解决方案1】:

很多人不知道sleep 是一个浮点值:

Suspends the current thread for duration seconds (which may be
any number, including a Float with fractional seconds). Returns the actual
number of seconds slept (rounded), which may be less than that asked for if
another thread calls Thread#run. Called without an argument, sleep() will
sleep forever.

  Time.new    #=> 2008-03-08 19:56:19 +0900
  sleep 1.2   #=> 1
  Time.new    #=> 2008-03-08 19:56:20 +0900
  sleep 1.9   #=> 2
  Time.new    #=> 2008-03-08 19:56:22 +0900

不能保证延迟是准确的:

3.times do 
  t1 = Time.now.to_f
  sleep 0.5
  t2 = Time.now.to_f
  puts t2 - t1
end

结果:

0.501162052154541
0.5010881423950195
0.5001001358032227

运行的其他任务可能会使这种偏差更大。

【讨论】:

  • 这解决了关于睡眠不准确的 OP 声明 - 在系统负载和给予 Ruby 的时间片的限制内,睡眠是准确的。 非常清楚尝试同时安排 100 个事件的问题。
  • 嘿,铁皮人,你是这里的警察吗?感谢您让我熟悉 StackOverflow 的礼仪,但如果您在这方面花费的时间多于实际帮助我的时间,那么我认为您有问题。
  • 请问?我想我已经做了两种不同的尝试来帮助你。我正在努力帮助您的问题得到答案,因为它是结束的目标,而且,我提供了一些额外的信息,可以帮助您或未来寻找信息的人。
  • @theTinMan 不,它没有解决问题。编辑 do 验证了问题中所说的内容..“但是 sleep() 并不那么准确”。第一篇/原始帖子只是误导。我对编辑给出了 +1,因为他们确实说“嘿,睡眠确实不准确”,即使它没有提供替代方案。 (这可能是最好的答案——例如,完全寻找一种不同的方法——但它应该作为重点,而不是与原始问题没有很好联系的次要想法。)
  • 我不确定 Ruby 是否能够(至少 MRI 及其当前状态)提供所需的准确度。 也许 JRuby 及其 Java 基础可以做得更好,但是 1000 多个线程或进程,即使在 C 语言中,同时触发似乎也是一个艰巨的要求,尤其是在我们大多数人使用的商品硬件上使用这些天。
猜你喜欢
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2017-09-29
  • 2011-05-18
  • 1970-01-01
相关资源
最近更新 更多