【问题标题】:Why does this code print the same thing twice?为什么这段代码会打印两次相同的东西?
【发布时间】:2011-03-17 16:57:40
【问题描述】:

我正在尝试编写一些小的超时代码:

t = Thread.new { sleep 3 } # <- The thread that will do stuff.
Thread.new { sleep 2; t.kill; p 'hi!' } # <- The thread that will kill it after two seconds.
t.join

如果第一个线程在两秒内完成它的工作,它将停止,主线程将无事可做。这将导致程序在第二个线程到达t.kill 部分之前退出。但是,当我运行这段代码时,"hi!" 会被打印两次。用puts 替换p 可以修复它。为什么会这样?

【问题讨论】:

  • @Marc:我发现如果你在终端中输入ruby(不带参数)并粘贴代码并按下Control-D,"hi" 只会打印一次。但是如果你真的把代码放到一个文件中,然后做ruby test.rb之类的事情,它就会发生。我认为这可能与 ruby​​ 读取文件的速度与 ruby​​ 读取标准输入的速度有关。
  • 绝对是一个错误。 ruby somefile.rb 大部分时间会打印两次,它是间歇性的。可以在 redmine.ruby-lang.org 上归档吗?你可以为ruby -v 指定“ruby 1.9.3dev (2010-07-19 trunk 28679) [x86_64-darwin10.4.0]”,因为我已经用主干复制了这个。或者让我知道,我会提出问题。

标签: ruby multithreading timeout


【解决方案1】:

Ruby 有一个与 io 缓冲和线程完全相同的错误。最近已修复,请升级。

【讨论】:

    【解决方案2】:

    这听起来像“嗨!”正在缓冲和刷新两次,一次由执行p 操作的匿名线程,一次由主线程。如果这是一个 C 程序,修复它的方法是禁用 stdout 上的缓冲,或者使用 write 到 fd 1,绕过 stdio。大概 Ruby 至少有这些选项中的第一个等价物?

    【讨论】:

      猜你喜欢
      • 2018-08-19
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多