2012-05-23 7 views
10

Quiero hacer una tarea de 'larga ejecución' (lleva unos 0.5 segundos para ejecutar) en una secuencia en un servidor web Sinatra.Cómo contar hilos en ejecución en el servidor de ruby ​​

La respuesta web tarda unos 20 ms, por lo que si me da ocupado entonces las discusiones se acumulan ...

así que pensé que lo haría si me lo sincroniza ocupada ..

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

¿Cómo se obtiene el número de subprocesos en ejecución (quiero que el número de subprocesos se inicien y no se ejecuten aún)? ¿Cómo se codifica running_thread_count?

def running_thread_count 
return Thread.list.count 
end 

¿Debo verificar si hay hilos en ejecución? es decir, cuando un hilo termina de ejecutarse, ¿dejará de volver a aparecer en Thread.list?

No quiero llamar a join porque eso sería contrario al objetivo, que es volver rápidamente a menos que tengamos una copia de seguridad con muchos hilos trabajando.

+0

Pero sin 'join', todos los hilos de salida si uno de ellos termina su ejecución. 'Thread.list.count' obtiene el número de hilos que se están ejecutando actualmente. 'Thread' tiene un método llamado' status' que devuelve '" sleep "' o '" run "' para hilos en proceso. He agregado el código como respuesta. – Kashyap

+0

Pensé que un programa de rubí que se ejecutaba como servidor web se mantenía en funcionamiento todo el tiempo, de modo que un hilo iniciado durante una solicitud web se ejecutara hasta su finalización. –

+0

Tienes un punto ahí. Experimentará más. Gracias – Kashyap

Respuesta

17

Esto le dará a la cuenta de hilos que están teniendo la condición de "carrera" y no "sueño"

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