2

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

loop do
   ..
end

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

问题是,为什么loopwhile true导致其中一个 cpu 核心 100% 的 cpu 负载?问题实际上是在循环中吗?

有没有办法在 ruby​​ 中以较低的 CPU 消耗进行无限循环?

此处提供的完整资源

UPD - 追踪

$ 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
4

1 回答 1

0

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

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

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

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

于 2013-06-23T08:03:00.940 回答