2011-01-01 17 views
6

Estoy implementando un sistema de verificación en Ruby. Ejecuta ejecutables con diferentes pruebas. Si la solución no es correcta, puede llevar una eternidad acabar con ciertas pruebas duras. Es por eso que quiero limitar el tiempo de ejecución a 5 segundos.¿Cómo salir de un proceso ejecutado con Ruby si lleva más de 5 segundos?

estoy usando() para ejecutar los ejecutables del sistema:

system("./solution"); 

.NET tiene una gran WaitForExit() método, lo que sobre Ruby ?.

¿Hay alguna forma de limitar el tiempo de ejecución del proceso externo a 5 segundos?

Gracias

Respuesta

11

Usted puede usar la biblioteca de tiempo de espera estándar, así:

require 'timeout' 
Timeout::timeout(5) { system("./solution") } 

De esta manera usted no tendrá que preocuparse acerca de los errores de sincronización.

+0

Gracias, funciona genial – Alex

+0

Elegí esta respuesta como aceptada porque, a diferencia de la solución de EnabrenTane, cada prueba no requiere 5 segundos como mínimo para completarse. Yo uso el sistema ("sudo killall solution") para matar el proceso de ejecución. – Alex

4

Tenedor su hijo, que ejecuta "./solution", el sueño, comprobar si su hacer, si no matarlo. Esto debería ayudarte a comenzar.

pid = Process.fork{ system("./solution")} 
sleep(5) 
Process.kill("HUP", pid) 

http://www.ruby-doc.org/core/classes/Process.html#M003153

+0

Gracias por el enlace. Veo que puedo usar el método de la bifurcación. ¿Pero cómo puedo conectarlo con el sistema ("./ solution")? – Alex

+1

@Alex, actualizado, debería ser más útil. – EnabrenTane

+0

¡Muchas gracias! Eso es exactamente lo que necesito. Solo hay un problema. Ahora todas las pruebas toman 5 segundos. Sin embargo, la mayoría de las pruebas se pasan en menos de un segundo. ¿Hay alguna manera de arreglar eso? – Alex

Cuestiones relacionadas