Ruby 为什么在线程中使用puts方法时会出现异常行为?

Ruby 为什么在线程中使用puts方法时会出现异常行为?,ruby,multithreading,Ruby,Multithreading,解决方案:在.irbc文件中,放置:IRB.conf[:USE\u READLINE]=false 我正在运行一些ruby代码: Thread.new do loop do a = @queue.pop puts "1" puts "2" end end 当我在irb中运行这个时,队列弹出,它会打印“1”,但不会立即打印“2”。我必须按几下回车键,它才会吐出“2”。为什么呢 这是我的irb日志: >> Thread.new do ?> loop do

解决方案:在.irbc文件中,放置:
IRB.conf[:USE\u READLINE]=false

我正在运行一些ruby代码:

Thread.new do
 loop do
   a = @queue.pop
   puts "1"
   puts "2"
 end
end
当我在irb中运行这个时,队列弹出,它会打印“1”,但不会立即打印“2”。我必须按几下回车键,它才会吐出“2”。为什么呢

这是我的irb日志:

>> Thread.new do
?>  loop do
?>    a = @queue.pop
>>    puts "1"
>>    puts "2"
>>  end
>> end
=> #<Thread:0x10ae6d1a0 sleep>
>> @queue << "something random"
1=> #<Queue:0x10aed6420>
>> 
?> 

?> 
?> 
2?> 
>Thread.new do
?>循环做什么
?>a=@queue.pop
>>把“1”
>>把“2”
>>结束
>>结束
=> #
>>@队列#
>> 
?> 
?> 
?> 
2?> 
以下是我得到的:

>> require "thread"
=> true
>> 
?> @queue = Queue.new
=> #<Queue:0x101bc9a60>
>> 
?> Thread.new do
?>  loop do
?>    a = @queue.pop
>>    puts "1 was printed at #{Time.now.to_f}"
>>    puts "2 was printed at #{Time.now.to_f}"
>>  end
>> end
=> #<Thread:0x101bb8058 sleep>
>> 
?> @queue << 42
1 was printed at 1328144684.33667=> #<Queue:0x101bc9a60>
>> 
?> 

?> 
?> 
2 was printed at 1328144686.4642?> 
>需要“线程”
=>正确
>> 
?>@queue=queue.new
=> #
>> 
?>Thread.new do
?>循环做什么
?>a=@queue.pop
>>puts“1在#{Time.now.to#f}打印”
>>puts“2是在#{Time.now.to#f}打印的”
>>结束
>>结束
=> #
>> 
?>@队列#
>> 
?> 
?> 
?> 
2以1328144686.4642打印?>

我没有得到你想要的。这两个数字在我的机器上以相同的毫秒打印。(我在Windows机器上以1.8.7的版本进行了尝试,但仍然得到了这个结果)

需要“线程”
@queue=queue.new
新做的
环道
a=@queue.pop
puts“1在#{Time.now.to#f}打印”
puts“2是在#{Time.now.to#f}打印的”
结束
结束
@队列需要“线程”
=>正确
irb(主要):002:0>
irb(主):003:0*@queue=queue.new
=> #
irb(主要):004:0>
irb(主):005:0*线程。新do
irb(主):006:1*循环do
irb(main):007:2*a=@queue.pop
irb(main):008:2>puts“1是在#{Time.now.to_f}打印的”
irb(main):009:2>放置“2在#{Time.now.to#f}打印”
irb(主要):010:2>结束
irb(主):011:1>结束
=> #
irb(主要):012:0>
irb(主):013:0*@队列#

由于我无法访问OS X Lion,我不知道这是否与Ruby on OS X Lion有关,但这是我的怀疑。

我做了一些实验,发现了发生的情况。您可能知道,两个Ruby线程不能同时运行;它们只是快速地来回切换。*通常,如果调用
gets
,调用线程将等待输入,其他线程将继续(因为
gets
释放)。但是,在irb中(至少在Mac OS X上),其他线程在等待输入时不会继续执行。例如:

>> i = 0
=> 0
>> Thread.new { loop { i += 1 } }
=> #<Thread:0x1094d6d68 run>
>> i
=> 234866
>> i
=> 401271
> for i in 1..10; print i ** 2, " "; end; puts
1 4 9 16 25 36 49 64 81 100 
nil
请注意,与irb不同,它不支持跨多行的语句,也不支持将插入符号移动到编辑位置或向上按历史记录(在Mac OS X上)。例如:

>> i = 0
=> 0
>> Thread.new { loop { i += 1 } }
=> #<Thread:0x1094d6d68 run>
>> i
=> 234866
>> i
=> 401271
> for i in 1..10; print i ** 2, " "; end; puts
1 4 9 16 25 36 49 64 81 100 
nil

是的。检查我的原始问题。我更新了我所得到的,嗯…对我来说不是这样的。这就是为什么我问可能出了什么问题。请检查我的原始问题,看看我得到了什么。@PragmaOnce:好的,你的操作系统和ruby版本是什么?你能做irb--version,
ruby--version
,然后进入irb并做
put ruby_version
?@PragmaOnce:对不起,我没有访问那个操作系统的权限。我不能再帮你了,谢谢你。谢谢你!!您的Ruby版本编译时启用了线程支持吗?@andrewdotnich:为什么要删除OS X lion标记?@Andrewgrim:因为我可以在雪豹上复制它。这可能是一个*nix实现问题,但这不仅仅是Lion…谢谢。您能建议我如何在仍然能够输入ruby代码(如irb)的情况下监视线程吗?基本上,我正在尝试记录每个线程的信息,以便查看程序在多个线程下的运行情况threads@PragmaOnce:我编辑了我的答案以添加irb的替代方案。希望对你有帮助。谢谢你!当您在Windows上测试它时,您是同时使用IRB还是其他RubyShell?你认为这个问题是针对Mac的吗?一些linux变体会像windows一样工作吗?找到了一种解决方法。在.irbc文件中,包括“IRB.conf[:USE_READLINE]=false”