2

ループで実行されるいくつかのコードを実装しました。

loop do
   ..
end

そのループでは、Curses ライブラリを使用してキープレスを処理します。Nを押して何かを入力すると、時間をカウントする新しいスレッドが開始されます(loop do .. end再び)

問題は、CPU コアの 1 つで 100% の CPU 負荷が発生するのはなぜloopですか? while true問題は実際にループしていますか?

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 からの入力がない場合は何もせず、1 秒後に再度チェックします。これにより、積極的にポーリングSTDINして高い CPU 負荷を生成することがなくなります。

于 2013-06-23T08:03:00.940 に答える