2013-06-23 37 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問題解決了自身後。