Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Ejecutar varias subrutinas simultáneamente.

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Dom Feb 05, 2006 2:19 pm
asteriscos
Perlero Nuevo
Perlero Nuevo
Registrado: 15 Ene 2006
Mensajes: 4
Ejecutar varias subrutinas simultáneamente. Responder citando

Hola,

Esto de aprender a programar se hace duro... y más cuando no tienes a nadie cerca para preguntarle cosas básicas ... ¡así que a ver si alguien puede ayudarme!
He diseñado una aplicación que está lanzando pings continuamente a una serie de máquinas remotas cada 100 segundos.
Esto funciona todo correctamente. Mi problema es que necesito tener controladas muchas máquinas. Tal y como he diseñado el programa, cuando tenga controladas, 150 o 200 equipos, tardará más de 100 segundos en lanzar un ping a cada una de ellas y en recoger e interpretar el resultado así q de alguna forma, tengo que poder ejecutar varias subrutinas simultáneamente, para así lanzar varios pings de forma simultánea y conseguir supervisar más equipos por segundo.
Estoy convencido de que esto se tiene que poder hacer pero la verdad....... he estado investigando en Internet y no he encontrado ningún sitio que me oriente como hacerlo.
¿Alguien puede arrojar un poco de luz a mi gran ignorancia ?

Gracias de antemano,
Joseba S.
Mensaje Dom Feb 05, 2006 2:47 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4126
Ubicación: Valladolid, España
Responder citando

1.- Para controlar muchas máquinas lo ideal es usar el protocolo SMNP, que para eso está.
2.- Hay utilidades de gestión de máquinas ya hechas, como el Nagios (Instalación, Configuración).
3.- Si la aplicación ya la tienes diseñada, pues entonces la aprovecharemos Smile

El problema con el monitorización con pings es justo el que comentas: tienes que esperar a que las máquinas vayan respondiendo para saber si están arriba o no.
Una opción es lanzar un proceso por cada máquina (o red de máquinas) y que se encargue de monitorizarlas. Luego tienes un programa principal que va mirando los resultados. El lugar común donde dejar los resultados puede/debe ser una base de datos.

Es una opción. A ver si hay más propuestas...
Mensaje Lun Feb 06, 2006 8:55 am
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

Hola:

En el siguiente artículo:
http://www.stonehenge.com/merlyn/UnixReview/col41.html

Randal L. Schwartz crea un código de ejemplo que te podría funcionar, pues hace un script que va creando procesos hijos para que se ejecuten paralelamente y manden pings justamente para ver si una maquina está viva o no.

Seguramente podrás implementarlo a tu propio próposito.


SALUDOS
Mensaje Lun Feb 06, 2006 12:10 pm
Perl user
Maestro Honorario
Maestro Honorario
Registrado: 03 Nov 2004
Mensajes: 385
Responder citando

La idea de usar forks es buena, aunque recordemos que el overhead y el request resources de Perl para realizar un fork es un poco costoso, en el caso de Win32 no se puede hacer mucho, fork está basado en ithreads ( en la misma idea ) ya que Windows no cuenta con un fork(1) similar al de un sistema operativo que cumpla con POSIX. Y si tienes ithreads habilidados en Win32, yo te recomiendaría utilizarlos, es menos costoso copiar solo la sección de datos y compartir memoria entre un thread, que copiar toda una imagen de proceso con fork(1).

Ahora bien si estás en un sistema POSIX ( cualquier UNIX ), fork si es menos costoso de alguna manera que ithreads, puesto que el model de Threads de Perl aun está muy verde, y es menos eficiente que fork(1) directamente...

Así que de alguna manera te recomiendo leer el manual del módulo de ithreads o perlthrtut. Comenzar a pensar en threading es muy bueno.

Ahora, independientemente de las soluciones anteriores, la que sigue mas eficiente, si quieres ejecutar pings simultáneos es utilizando POE, dirán: "Ah como le hace propaganda", no no es propaganda, aunque conozco de muy cerca ( tiempo ) al autor... el framework es una técnica estudiada de hace mucho tiempo, publicada por Donald E. Knuth en sus libros "The Art of Computer Programming" publicados por los 70's.

Bien, no explicaré de nuevo que hace POE, pero basta decir que su naturaleza nata es ser multitareas, por lo tanto ejecutar operaciones "simultáneas" ( en un X quantum de tiempo ) es su especialidad.

Te dejo un ejemplo de como hacer lo del ping simultáneo desde POE:

http://poe.perl.org/?POE_Cookbook/Pinging_Multiple_Hosts

Saludos,
Mensaje Mie Feb 08, 2006 6:51 am
asteriscos
Perlero Nuevo
Perlero Nuevo
Registrado: 15 Ene 2006
Mensajes: 4
Responder citando

Hola,

Lo primero gracias a todos los que habeís respondido !!!!
De todas las respuestas recibidas, la que más me ha gustado es la que propone "Una opción es lanzar un proceso por cada máquina (o red de máquinas) y que se encargue de monitorizarlas. Luego tienes un programa principal que va mirando los resultados"
Desde luego esta opción me parece la más sencilla y como no tengo problemas de rendimiento, pues es la opción más interesante......
¿ Pero....... como lo pongo en prácita ? - ¿ alguien me puede poner un ejemplo muy sencillo ?
Gracias por iluminar mi ignorancia !!!!!

Joseba S.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group