Ruby 在线程内调用print/puts时的线程输出

Ruby 在线程内调用print/puts时的线程输出,ruby,multithreading,stdout,Ruby,Multithreading,Stdout,我试图创建一个简单的动画外壳旋转器家伙 STDOUT.sync # spinner stuff spinner_running = false chars = ['|', '/', '-', '\\'] @spinner = Thread.new do loop do unless spinner_running Thread.stop print "\b" end print chars[0] sleep(1) print

我试图创建一个简单的动画外壳旋转器家伙

STDOUT.sync

# spinner stuff
spinner_running = false
chars = ['|', '/', '-', '\\']
@spinner = Thread.new do
  loop do
    unless spinner_running
      Thread.stop
      print "\b"
    end
    print chars[0]
    sleep(1)
    print "\b"
    chars.push chars.shift
  end
end

def start_spinner
  spinner_running = true
  @spinner.wakeup
end

def stop_spinner
  spinner_running = false
end

print ".......X"

start_spinner()
sleep(5)
stop_spinner()
只是尝试创建一个简单的旋转器,是的,我知道有一个宝石

为什么在代码中执行微调器时,我看不到它的进度

当前输出:
ruby spinner.rb

.......X< new prompt (no new line) > 
…X

spinner\u正在运行
需要
@spinner\u正在运行

它首先定义为一个局部变量,然后在线程中使用,这很好,因为块可以访问它定义的范围。但是,
start\u
stop\u
spinner
方法定义了它们自己的范围,因此在使用
spinner\u running
时,它是一个新定义的局部变量

因此线程使用的
spinner\u running
从未设置为true-因此线程在运行时会立即退出

要修复它,需要通过在它前面加上
@
将它变成一个实例变量


在回答您的评论时,我认为线程没有一个简单的方法来发现这一点,因为bug不在线程中。

是的,这是问题的核心,有一些范围错误被隐藏在线程的无声失败中。。。有什么方法可以检测线程上的这些错误吗?我不认为线程失败了-它完全按照你的要求做了!嗯,我想不出线程检测错误的方法-但从好的方面来看,我可以看到,这个特定的错误永远不会在测试中意外出现,然后在生产中失败。顺便说一句,我不是想用简单的解释来光顾你,我只是觉得这对以后可能会问这个问题的其他人会有用。