[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