Ruby 为什么在线程中使用puts方法时会出现异常行为?
解决方案:在.irbc文件中,放置: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
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”