2012-05-23 6 views
10

Ich möchte eine "lange läuft" - Aufgabe (dauert etwa 0,5 Sekunden) in einem Thread in einem Sinatra-Webserver.Wie zähle ich laufende Threads in Ruby Server

Die Web-Reaktion dauert etwa 20 ms, also wenn ich voll werden, dann werden Themen anhäufen ...

So dass ich dachte, dass ich es tun würde, wenn ich synchronisieren beschäftigt bekommen ..

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

Wie erhalten Sie die Anzahl der laufenden Threads (Ich möchte die Anzahl der Threads gestartet und noch nicht fertig ausgeführt) - Wie code Sie running_thread_count?

def running_thread_count 
return Thread.list.count 
end 

Oder muss ich nach Threads suchen, die ausgeführt werden? Wenn ein Thread fertig ist, hört er dann auf, in der Thread.list zurück zu kommen?

Ich möchte nicht Join aufrufen, da dies den Zweck besiegen würde - die Rückkehr schnell ist, es sei denn, wir sind mit vielen Threads arbeiten gesichert.

+0

Aber ohne 'join', alle Fäden beendet, wenn einer von ihnen die Ausführung beendet haben Dies gibt. 'Thread.list.count' erhält die Anzahl der aktuell laufenden Threads. 'Thread' hat eine Methode mit dem Namen' status', die '' sleep '' oder ''run'' für Threads im Prozess zurückgibt. Ich habe den Code als Antwort hinzugefügt. – Kashyap

+0

Ich dachte, dass ein Ruby-Programm, das als Webserver läuft, die ganze Zeit läuft, so dass ein Thread, der während einer Web-Anfrage gestartet wurde, bis zum Ende läuft. –

+0

Sie haben da einen Punkt. Wird mehr experimentieren. Vielen Dank – Kashyap

Antwort

17

die Anzahl der Threads, die den Status „run“ und nicht „Schlaf“

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