我实现了一些在循环中运行的代码:
loop do
..
end
在该循环中,我使用Curses库处理按键。如果我按N并输入内容,我会启动一个新的线程,它计算时间(loop do .. end
再次)
问题是,为什么loop
或while 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
答案 0 :(得分:-1)
经过user2246674的一些思考和建议后,我设法解决了这个问题。它不在线程内,它是主循环。
我在主循环中有这样的代码:
c = Curses.getch
unless c.nil?
# input handling
将睡眠1添加到else
后问题得到解决。当没有来自Curses的输入时,它什么都不做,然后在一秒钟内再次检查,这会阻止它主动轮询STDIN
并产生高CPU负载