rescue true

24 mayo, 2010

Ejecutar tareas no periodicas en segundo plano

Filed under: Linux,Ruby on Rails,Tips&Tricks — xurdekio @ 7:51 am
Tags: , , , ,

En muchas ocasiones nuestras aplicaciones necesitaran hacer tareas que tarden bastante tiempo en dar respuesta y esto provocará que el servidor nos devuelva un timeout y veamos la página de error de la aplicación.
Una solución para ejecutar estas tareas es realizarlas en segundo plano, de forma que la aplicación se olvide del proceso y conteste al navegador rapidamente evitando así el dichoso timeout.
Para esto Ruby on Rails combinado con la potencia de Linux nos proporciona una magnífica herramienta que es el script/runner, que nos permite ejecutar una función cargando todo el entorno de la aplicación.

Vamos a suponer que tenemos una función Boletin.enviar, que envía boletines a todos los usuarios registrados en la web (y nuestra web es impresionante y tiene miles de usuarios). La función completa envia por lotes, tiene una cola, etcetera, con lo cual tarda bastante en ejecutarse, no podemos dejar al usuario que envía el boletín esperando respuesta.
Así pues nuestro action para enviar el boletín sera algo asi:

def enviar_boletin
  system("ruby script/runner \"Boletin.enviar\"&")
end

Con el & de unix le indicamos que se ejecute en segundo plano. Los lectores más avispados ya os habreis dado cuenta de que si el proceso padre, en este caso el hilo de ruby que está ejecutando el servidor, se muere pues tambien morirá su hijo y nunca llegaremos a terminar la tarea. Para ello otroa solucion de sistemas usando nohup

def enviar_boletin
  system("nohup ruby script/runner \"Boletin.enviar\"&")
end

Y por ultimo, ¿qué ocurre si queremos pasarle argumentos a la función? pues se los pasamos como si fuese una funcion normal:

def enviar_boletin
  from = "nuestro_email@nuestrodominio.es"
  system("nohup ruby script/runner \"Boletin.enviar('#{from}')\" &")
end

Espero que os sea tan util como me ha sido a mi en varios proyectos de gran envergadura.

Dejar un comentario »

Aún no hay comentarios.

RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Blog de WordPress.com.

A %d blogueros les gusta esto: