2008-09-22 10 views
24

De PyPubSub:Módulo de publicación/suscripción/despacho recomendado de Python?

Pypubsub proporciona una forma sencilla para su aplicación Python para desacoplar sus componentes: partes de su aplicación pueden publicar mensajes (con o sin datos) y otras partes pueden suscribir/recibir ellos. Esto permite mensaje "remitentes" y el mensaje "oyentes" a no ser conscientes de cada otra:

  • uno no necesita importar la otra
  • un remitente no necesita saber
    • "que" recibe los mensajes,
    • lo que los oyentes van a hacer con los datos,
    • o incluso si cualquier oyente obtendrá los datos del mensaje.
  • De manera similar, los oyentes no tienen que preocuparse acerca de dónde provienen los mensajes.

Esta es una gran herramienta para la aplicación una arquitectura Modelo-Vista-Controlador o cualquier arquitectura similar que promueve la disociación de sus componentes.

Parece que hay un buen número de módulos de Python para la publicación/suscriban flotando alrededor de la web, desde PyPubSub, a PyDispatcher a clases simples "casera".

¿Existen ventajas y desventajas específicas cuando se comparan diferentes módulos diferentes? ¿Qué conjuntos de módulos se han comparado y comparado?

Gracias de antemano

Respuesta

14

PyDispatcher se utiliza mucho en Django y está funcionando perfectamente para mí (y para toda la comunidad de Django, supongo).

Por lo que recuerdo, hay algunos problemas de rendimiento:

  • Argumentos comprobación realizadas por PyDispatcher es lento.
  • Las conexiones no utilizadas tienen una sobrecarga innecesaria.

AFAIK es muy poco probable que se encuentre con este problema en una aplicación pequeña a mediana. Entonces estos problemas pueden no preocuparte. Si crees que necesitas cada libra de rendimiento (¡la optimización prematura es la raíz de todo mal!), Puedes ver las modificaciones hechas a PyDispatcher en Django.

Espero que esto ayude.

+0

Es interesante saber que las señales de Django se basaron en PyDispatcher. –

2

Recientemente miré con atención a py-amqplib para actuar como un cliente AMQP para un intermediario RabbitMQ. La última herramienta está escrita en Erlang.

Si está buscando desacoplar su aplicación. entonces ¿por qué unirlo al lenguaje en sí?Considere usar colas de mensajes que son neutras en cuanto al idioma y ¡entonces realmente tiene espacio para crecer!

Dicho esto, AMQP se esfuerza por comprender y puede ser más de lo que está dispuesto a asumir si su aplicación. está funcionando bien tal como está. YMMV.

+0

Soy un gran admirador de las colas de mensajes, pero a veces se trata menos de desacoplar una aplicación de la misma, sino que se necesita otra forma para que las diferentes partes de la aplicación hablen entre sí, y una solución simple en proceso es una mejor ajuste que la opción de mano dura de un servicio de middleware de mensajería real. Una ventaja de elegir la versión en proceso es que aún es bastante fácil agregar la mensajería remota más tarde agregando un suscriptor de mensaje que luego serializa el mensaje y lo pasa al intermediario, o se conecta al intermediario y publica el mensaje no serializado de nuevo en proceso. – SingleNegationElimination

1

También están las bibliotecas de PJ Eby, RuleDispatch y el proyecto PEAK, especialmente Trellis. No sé cuál es su estado en realidad, pero la lista de correo está bastante activa.

Last version of Trellis on PyPi

Trellis doc

También he utilizado los componentes de la Kamaelia project de la BBC. Axon es un enfoque interesante, pero inspirado en más componentes que editores-consumidores. Bueno, su sitio web no está actualizado en absoluto ... Hubo un proyecto o 2 en el Google SoC 2008 y se está trabajando.

No sabe si ayuda :)

Editar: acabo de encontrar Py-notify que es una implementación "poco ortodoxo" del patrón Observer. Tiene la mayoría de las funcionalidades que necesito para mis propias herramientas.

0

El hecho de que PyPubSub parece ser un proyecto caótico (el Wiki en SF está muerto, el sitio web (otra Wiki) que está vinculado a SF actualmente está roto) sería suficiente razón para no usarlo . PyDispatcher tiene un sitio web intacto, pero la única documentación que parecen proporcionar es la de la API generada a partir de los documentos. No hay tráfico en la lista de correo tampoco ... ¡una mala señal!

Como Mike también mencionó, es perfectamente posible elegir una solución que sea independiente de Python. Ahora no me malinterpreten, I amor Python, pero aún así, en este campo puede tener sentido utilizar un marco que está desacoplado del lenguaje de programación.

No tengo experiencia con los mensajes, pero estoy planeando echarle un vistazo a algunas soluciones. Hasta ahora, estos dos proyectos (gratuito, de código abierto) parecen ser los más prometedores para mí (casualmente, ambos son proyectos de Apache):

Ambos parecen ser razonablemente proyectos maduros, al menos en cuanto a documentación y comunidad. No puedo comentar sobre la calidad del software, sin embargo, como dije, no utilicé ningún software.

Qpid se envía con las bibliotecas cliente para Python, pero también puede usar py-amqplib. Para ActiveMQ hay pyactivemq, que puede usar para conectarse a través de STOMP (Protocolo de mensajería orientado por texto en flujo continuo) oa través de Openwire.

+0

Esto es antiguo y no tiene ningún voto, pero hace afirmaciones falsas sobre PyPubSub basadas en una búsqueda apresurada (sitio web incorrecto) y en un posible uso futuro en lugar de experiencia de primera mano, lo mejor es evitar hacerlo así -1. El OP citado de pubsub.sf.net (como lo era en aquel entonces), pero su descripción indica que miró pypubsub.sf.net, un proyecto que * no está relacionado * con el PyPubSub en cuestión. PyPubSub @ pubsub.sf.net era (y sigue siendo) un candidato muy fuerte para la programación basada en eventos en la aplicación, con muchos documentos y ejemplos de uso incluso en aquel entonces, y características únicas tales como documentos de mensajes. – Schollii

2

Algunas bibliotecas que he encontrado que aún no se han mencionado:

3

El mejor paquete de despacho para el pitón parece ser el dispatch module dentro de Django (llamado signals en la documentación). Es independiente del resto de django, y es corto, documentado, probado y muy bien escrito.

Editar: Hice este proyecto en un independent signal project para Python.

+0

"Es independiente del resto de django ... " Aparentemente no: https://github.com/django/django/blob/master/django/dispatch/dispatcher.py#L71 –

+1

It * is * independent of el resto de django. Elimine la línea que destacó y obtiene este paquete independiente: https://github.com/olivierverdier/dispatch –

+0

En mi búsqueda también me encontré con esto: https://github.com/theojulienne/PySignals que parece ofrecer el mismo cosa. Y esto: https://github.com/11craft/louie que parece ser un descendiente "más complicado" de PyDispatch (que no pude encontrar ninguna documentación para). Tenía la intención de investigar esto, pero si tiene un minuto, ¿cuál es la diferencia entre estos proyectos? –

2

Aquí hay uno más nuevo: https://github.com/shaunduncan/smokesignal. "ahumada es un simple biblioteca de Python para enviar y recibir señales Se absorbe parte de la inspiración del marco señal de Django, pero se entiende como una variante de propósito general.". Ejemplo:

from time import sleep 
import smokesignal 

@smokesignal.on('debug') 
def verbose(val): 
    print "#", val 


def main(): 
    for i in range(100): 
     if i and i%10==0: 
      smokesignal.emit('debug', i) 
     sleep(.1) 

main()