2013-06-23 104 views
1

我实现一些代码,它运行在一个循环:红宝石无限循环导致100%的CPU负载

loop do 
    .. 
end 

在这循环中,我处理与诅咒库按键。如果我按N和输入了什么东西,我开始一个新的线程,该线程(再次loop do .. end)计算时间

的问题是,为什么loopwhile true导致在CPU内核中的一个100%的CPU负载?问题在循环中有效吗?

有没有办法做到与红宝石较低的CPU消耗无限循环?

提供完整的源here

UPD - strace的

$ strace -c -p 5480 
Process 5480 attached - interrupt to quit 
^CProcess 5480 detached 
% time  seconds usecs/call  calls errors syscall 
------ ----------- ----------- --------- --------- ---------------- 
51.52 0.002188   0 142842   ioctl 
24.21 0.001028   0  71421   select 
14.22 0.000604   0  47614   gettimeofday 
10.05 0.000427   0  47614   rt_sigaction 
0.00 0.000000   0  25   write 
0.00 0.000000   0  16   futex 
------ ----------- ----------- --------- --------- ---------------- 
100.00 0.004247    309532   total 
+3

为什么不使用100%的CPU?没有理由不去尝试 - 如果这实际上在做一些非常重要的工作*会怎么样?为了避免吃掉CPU,[“睡眠”](http://apidock.com/ruby/Kernel/sleep)线程。一个简单的“睡眠(0)”就足够了。 – user2246674

+0

线程 – baldrs

+2

已经有'睡眠1'作为循环逻辑的一部分有可能是一个繁忙的循环某处(例如在其中一个产生的线程),这是不是很好.. – user2246674

回答

0

一些thinkinking和建议user2246674后,我设法解决这个问题。它不在线程内,它真的在主循环中。

我有主环路内侧这样的代码:

c = Curses.getch 
    unless c.nil? 
    # input handling 

增加睡眠1至else问题解决了自身后。