[Madrid-pm] Colas en Perl

Diego Kuperman diego en kuperman.com.ar
Mar Ene 17 05:26:50 PST 2012


Hola JJ!,

On 1/17/12 1:39 PM, JJ Merelo wrote:
> Hola,
> Estoy intentando ver cómo gestionar colas en Perl. El problema viene,
> como siempre, de implementar un algoritmo evolutivo. Lo he hecho en
> CouchDB con la población almacenada ahí y diferentes clientes pidiendo
> cromosomas para evaluar o reproducirlos. Los detalles no vienen al
> caso, pero el problema es que CouchDB devuelve conjuntos aleatorios
> que se pueden solapar, lo que hace que se pierda en eficiencia.
> Posiblemente haya una mejor forma de hacerlo, pero lo que se me ha
> ocurrido es usar un feed que da CouchDB con los cambios, y al que se
> puede acceder mediante una librería que usa AnyEvent; a partir de ese
> feed, crear "paquetes" de cromosomas a evaluar únicos, que se vayan
> sirviendo a los clientes. He estado mirando cómo hacerlo desde CouchDB
> y en principio no se puede. Así que la idea era que en vez de que los
> clientes pidieran cromosomas directamente a CouchDB, el lector del
> feed de cambios creara paquetes y los mandara a una cola de mensajes;
> los clientes leerían de esa cola de mensajes paquetes que, en
> principio, no se solaparían. Todo de forma asíncrona, sin cerrar a
> nadie ni nada.
> Cómo se implemente me preocupa poco, se puede usar POE, o AnyEvent o
> incluso node.js; pero el problema es que he intentado ver los sistemas
> de colas que hay y no sé muy bien con cuál quedarme, o cuál funcionará
> mejor con Perl.
> He probado Spread y el módulo del mismo nombre y simplemente no
> funciona, devuelve null cuando uno se conecta. TheSchwartz es más bien
> un modelo de trabajadores, y no es lo que busco. Quizás ActiveMQ con
> Net::Stomp, pero no quiero meterme en un jardín que complique más las
> cosas de lo que debería ser algo sumamente simple: un buzón donde deje
> paquetes y se puedan sacar de forma asíncrona, sin preocuparme
> demasiado la prioridad.
>
> ¿Alguna ayuda?
>
Yo he usado para otros temas gearman, sobre todo para cuando necesito en 
"tiempo real" los resultados pero tambien teniendo la posibilidad de que 
sean completamente asíncronos. Es estable y hay module EV. Creo que esto 
te puede resolver.

Sino, hace un par de semanas he implementado un sistema de colas sobre 
redis (copiando uno que hay en ruby para poder usar su interfaz web) que 
puedes encontrar en https://metacpan.org/module/Resque :)

Otra opción liviana y con modulo EV sería usar el sistema de pubsub de 
redis a pelo: http://redis.io/topics/pubsub

(Aunque yo creo que gearman es mas apropiado para lo que yo entiendo que 
necesitas).

-dk


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