【问题标题】:Thread output when print/puts called inside thread在线程内调用 print/puts 时的线程输出
【发布时间】:2012-03-08 19:15:29
【问题描述】:

我尝试创建一个简单的动画外壳旋转器人......

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) > 

【问题讨论】:

    标签: ruby multithreading stdout


    【解决方案1】:

    spinner_running 必须是 @spinner_running

    它首先定义为局部变量,然后在线程中使用,这很好,因为块可以访问它定义的范围。但是 start_stop_ spinner 方法定义了它们自己的范围,所以当spinner_running在那里使用时,它是一个新定义的局部变量。

    因此线程使用的spinner_running 永远不会设置为true - 因此线程在运行时会立即退出。

    要修复它,需要通过前缀@将其制成实例变量。

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

    【讨论】:

    • 是的,这是问题的核心所在,有一些范围错误被线程默默地隐藏了......有什么方法可以检测线程上的这些错误?
    • 我不认为线程失败了——它完全按照你告诉它的!
    • 嗯,我想不出线程检测错误的方法 - 但从好的方面来说,这个特定的错误永远不会在测试中意外工作,然后在生产中失败,我可以看到。
    • 顺便说一下,我并不是想用简单的解释来光顾你,只是觉得它对以后可能会提出这个问题的其他人有用。
    猜你喜欢
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多