[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