0

我正在尝试开始使用 Netbeans 7.0 进行 Rails 开发,并且正在使用最新的 ruby​​ 插件。作为记录,我将默认的 1.8.7 解释器切换为指向本地 1.9.2 ruby​​ 安装,但是这两个解释器似乎都发生了这个问题。

当 ruby​​ 在我的代码中遇到错误时,错误输出会显示在我的控制台输出中的随机点。我原以为它会在遇到错误时打印错误,但看起来错误流和正常输出流正在不同的线程上更新。举个例子……用这段代码:

(0..10).each { |o| puts "Normal output" }
invalidSytax!

我在第二行触发了一个语法错误,但错误输出可能会有所不同。例如:

Normal output
Normal output
Normal output
~/LearnRuby/lib/ch1_ex2.rb:41:in `<main>': undefined method `invalidSytax!' for main:Object (NoMethodError)
Normal output
Normal output
Normal output
Normal output
Normal output
Normal output
Normal output
Normal output

和...

~/LearnRuby/lib/ch1_ex2.rb:41:in `<main>': undefined method `invalidSytax!' for main:Object (NoMethodError)
Normal output
Normal output
Normal output
Normal output
Normal output
Normal output
Normal output
Normal output
Normal output
Normal output
Normal output

知道是什么原因造成的吗?我可以看到它在一个更大的项目中是一个大问题,当我可能认为我的代码没有问题但在我的控制台流的开头确实输出了一条错误消息时。

4

1 回答 1

0

这是因为 NetBeans 对 STDOUT 和 STDERR 的内部处理,输出不是确定性的,我想正如您已经怀疑的那样,它们都在两个单独的线程中处理。所以你很可能是这里比赛条件的见证人。

但这与是否使用 Ruby 无关——例如,当我为我的 Java 项目运行 JUnit 测试时,也会发生同样的情况,STDERR 和 STDOUT 输出不确定地混合在一起。

为什么你认为这是一个问题?只要输出没有混合成乱码(如果两个线程都尝试同时写入 NetBeans 的控制台并且没有适当的锁定机制,就会发生这种情况)我不明白为什么这很重要。

使用 Web 应用程序的日志文件可以观察到相同的原理。如果许多客户端连接尝试同时将它们的信息记录到文件中,您将无法预测消息出现的顺序——在我看来,这种行为是多线程应用程序所固有的。

于 2011-07-11T00:47:16.500 回答