2012-05-23 25 views
10

我想在Sinatra Web服務器的線程中執行'長時間運行' - (需要大約0.5秒的時間執行)任務。如何統計ruby服務器中的運行線程

該網站的響應時間爲20毫秒,所以如果我忙呢線程將堆積...

所以我在想,我會做同步,如果我去忙..

if (running_thread_count > 10) 
    stuff_that_takes_a_second() 
else 
    Thread.new do 
     stuff_that_takes_a_second() 
    end 
end 

如何獲得正在運行的線程數(我想要啓動線程的數量,還沒有完成運行) - 您如何編寫running_thread_count?

def running_thread_count 
return Thread.list.count 
end 

或者我需要檢查正在運行的線程?即當一個線程完成運行時,它會停止返回到Thread.list中嗎?

我不想調用連接,因爲這會打敗目的 - 除非我們備份了大量的線程,否則這將很快返回。

+0

但如果沒有'join',所有如果其中一人完成執行線程退出。 'Thread.list.count'獲取當前正在運行的線程數。 'Thread'有一個名爲'status'的方法,它爲正在處理的線程返回''sleep''或''run''。我已經添加了代碼作爲答案。 – Kashyap

+0

我認爲作爲Web服務器運行的ruby程序一直在運行,以便在Web請求期間啓動的線程運行至完成狀態? –

+0

你有一個點。將實驗更多。謝謝 – Kashyap

回答

17

這會給那些具有「運行」狀態的線程的數量,而不是「休眠」

def running_thread_count 
    Thread.list.select {|thread| thread.status == "run"}.count 
end