[Madrid-pm] perl threads
Salvador Fandino
sfandino en yahoo.com
Jue Oct 14 02:24:56 PDT 2010
----- Original Message ----
> From: mipassa <mipassat en gmail.com>
> To: Lista de correo de Madrid Perl Mongers <madrid-pm en pm.org>
> Sent: Wed, October 13, 2010 11:03:51 PM
> Subject: Re: [Madrid-pm] perl threads
>
> Cierto todo lo que dices. Pero mi problema podría tratar por ejemplo de
> sondear estado de 100K equipos, que mientras llegas o no, te da timeout, y
> demás tiempo muertos, estas pasando a los otros 99.999. La cosa es llenar
> esos tiempos muertos con algo/thread ocioso y que no haya que estar creando
> continuamente costosos hijos/forks/procesos
En un sistemas operativo decentes, hoy en día crear procesos nuevos no es una
operacion tan costosa.
Por ejemplo, el siguiente programa en C, en mi PC de hace algunos años con Linux
se ejecuta en 13 segundos.
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
int main(int argc, char *argv[]) {
signal(SIGCHLD, SIG_IGN);
for (int i = 0; i < 100000; i++) {
if (fork() == 0) exit(0);
}
}
Osea, que es capaz de ejecutar casi 10.000 forks por segundo (aunque hay que
tener en cuenta que el coste del fork es proporcional a los recursos de memoria,
ficheros, etc. que estan siendo utilizados por el proceso, por lo que en la
practica, con programas reales no va a ser tan rapido). Un programa similar en
Perl tarda 1m 45s, unos 1000 por segundo, que tampoco esta nada mal.
Si realmente necesitas ejecutar tantas cosas en paralelo yo investigaria la
posibilidad combinar dos niveles de paralelismo. Por un lado tener varios
procesos para ocupar todas las CPUs que tengas disponibles y luego dentro de
cada proceso varios hilos de ejecucion, ya sea utilizando Coro o programacion
orientada a eventos con algo como POE.
En cualquier caso, no uses los ithreads!!!
- Salva
Más información sobre la lista de distribución Madrid-pm