Ruby无限循环导致100%的CPU负载

时间:2013-06-23 06:57:05

标签: ruby curses

我实现了一些在循环中运行的代码:

loop do
   ..
end

在该循环中,我使用Curses库处理按键。如果我按N并输入内容,我会启动一个新的线程,它计算时间(loop do .. end再次)

问题是,为什么loopwhile true会导致其中一个cpu内核100%的CPU负载?这个问题是否会在循环中发生?

有没有办法在ruby中用较低的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

1 个答案:

答案 0 :(得分:-1)

经过user2246674的一些思考和建议后,我设法解决了这个问题。它不在线程内,它是主循环。

我在主循环中有这样的代码:

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

将睡眠1添加到else后问题得到解决。当没有来自Curses的输入时,它什么都不做,然后在一秒钟内再次检查,这会阻止它主动轮询STDIN并产生高CPU负载