[Madrid-pm] perl threads

Diego Kuperman diego en kuperman.com.ar
Jue Oct 14 02:42:09 PDT 2010


Hola!,

On 10/13/10 11:03 PM, mipassa wrote:
> 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
> 

Mi recomendación es que uses AnyEvent::Gearman :)

Es decir, que montes un server de gearman, que separes los tipos de
tareas por workers (o pongas todas en uno solo) y que levantes mas
workers segun vas necesitando en cada tarea. Cada worker a su vez
funcionaria con eventos y podria hacer "mas de una cosa a la vez cuando
toca esperar sondas y esas cosas". Es lo que yo uso para hacer
peticiones http y va MUY bien.

Esto es un ejemplo de un worker que trae datos de usuarios en twitter:

use AnyEvent::Gearman::Worker;
use AnyEvent::HTTP;

my $worker = AnyEvent::Gearman::Worker->new(
    job_servers => [ '127.0.0.1' ],
);

$worker->register_function( twitter_user_info => sub {
    my $job = shift;
    my $screen_name = $job->workload;
    print STDERR "Getting info for $screen_name\n";
    http_get(
        "http://api.twitter.com/1/users/show.json?screen_name=$screen_name"
            => sub {
                my ( $body, $header ) = @_;
                print STDERR "Info for $screen_name received\n";
                $job->complete( $body );
            }
    );
});

AnyEvent->condvar->recv;

----
Tiene la ventaja, como decia Rodrigo, que si necesitas mas músculo, pues
es solo poner mas maquinas y levantar los workers que hagan falta.

-dk

> Thanks again por vuestras sabias opiniones
> 
> -----Mensaje original-----
> De: madrid-pm-bounces+mipassat=gmail.com at pm.org
> [mailto:madrid-pm-bounces+mipassat=gmail.com at pm.org] En nombre de Joaquín
> Ferrero
> Enviado el: miércoles, 13 de octubre de 2010 22:53
> Para: Lista de correo de Madrid Perl Mongers
> Asunto: Re: [Madrid-pm] perl threads
> 
> El 13/10/10 20:59, mipassa escribió:
>> Hola,
>>
>> Mi pega es que mientras que con perl lanzo 10 procesos (por poner un
> número)
>> para hacer 10 "cosas" en un intervalo de tiempo, aprovechando al máximo
> los
>> recursos de la máquina, para ese mismo periodo con Java en esa misma
>> máquina, me creo que puedo lanzar 100K threads que me hacen 100mil "cosas"
>> :(
> 
> ¿Cien mil "cosas"?
> 
> ¿Es que, acaso, tienes, "cien mil" núcleos de procesador?
> 
> ¿Qué sentido tiene arrancar un montón de threads si tienen que esperarse
> unos a otros para que les atienda el procesador?
> 
> Al final, con tanto cambio de contexto, tienes menos rendimiento que si lo
> hicieras de forma secuencial.
> 
> Yo, como máximo, monté un "cluster" que sumaba 32Gb, 8 procesadores con dos
> núcleos cada uno, así que, por mucho que yo quisiera, nunca habría más de 16
> procesos activos de forma simultánea (y uno de ellos, al menos, atendiendo
> al sistema operativo).
> 
> Mi problema era procesar ficheros muy grandes, que, de forma normal (en un
> solo procesador), tardaba 100 minutos. Pero como el problema se podía
> dividir, lo hice en 16 partes cada uno. Al final, el tiempo final no era
> exactamente 1/16, sino mayor, algo así como 1/10 del tiempo inicial.
> 
> usé Parallel::ForkManager;  # nada más, algo muy sencillo
> 
> En los problemas en los cuales hay "cien mil" elementos, queda muy bonito
> modelizar el problema en torno a objetos que tienen su "vida propia" (estoy
> pensando en los MMORPG), pero eso mismo se puedo hacer de otras formas, que
> reparta mejor la carga entre los procesadores disponibles.
> 
> IMO, por supuesto.
> 


Más información sobre la lista de distribución Madrid-pm