2008-09-22 14 views
24

Von PyPubSub:Empfohlen Python Publish/Subscribe/Dispatch Modul?

Pypubsub für Ihre Python-Anwendung bietet eine einfache Möglichkeit seine Komponenten zu entkoppeln: Teile Ihrer Anwendung können Nachrichten veröffentlichen (mit oder ohne Daten) und andere Teile können abonnieren/empfangen Sie. Dies ermöglicht Meldung „Absender“ und Meldung „Zuhörer“ jeder andere nicht bewusst zu sein:

  • man braucht nicht die anderen
  • ein Sender
      wissen müssen nicht importiert werden
    • „die“ die Nachrichten bekommen,
    • , was die Zuhörer mit den Daten zu tun,
    • oder auch wenn ein Zuhörer die Nachrichtendaten erhalten.
  • In ähnlicher Weise müssen sich Zuhörer nicht darum kümmern, woher Nachrichten kommen.

Dies ist ein großes Werkzeug Model-View-Controller-Architektur oder eine ähnliche Architektur für die Implementierung, die Entkopplung seiner Komponenten fördert.

Es scheint ziemlich vielen Python-Module für die Veröffentlichung zu sein/Floating rund um das Web abonnieren möchte, von PyPubSub, zu PyDispatcher zu einfachen „hausgemachten“ Klassen.

Gibt es spezifische Vor- und Nachteile beim Vergleich verschiedener Module? Welche Module wurden verglichen und verglichen?

Vielen Dank im Voraus

Antwort

14

PyDispatcher ist stark in Django und es funktioniert perfekt für mich (und für ganze Django Community, ich denke) verwendet.

Wie ich mich erinnere, gibt es einige Performance-Probleme:

  • Argumente von PyDispatcher gemacht Prüfung ist langsam.
  • Nicht verwendete Verbindungen haben unnötigen Overhead.

AFAIK es ist sehr unwahrscheinlich, dass Sie auf diese Probleme in einer kleinen bis mittleren Anwendung stoßen werden. Diese Probleme können Sie also nicht betreffen. Wenn du denkst, dass du jedes Pfund an Leistung brauchst (eine vorzeitige Optimierung ist die Wurzel allen Übels!), Kannst du Änderungen in PyDispatcher in Django betrachten.

Hoffe, das hilft.

+0

interessant, dass django Signale zu wissen, beruhten auf PyDispatcher. –

2

Ich habe mir kürzlich py-amqplib genau angesehen, um als ein AMQP-Client für einen RabbitMQ-Broker zu fungieren. Das letztere Werkzeug ist in Erlang geschrieben.

Wenn Sie Ihre App entkoppeln möchten. Warum sollte man es dann mit der Sprache verbinden?Erwägen Sie die Verwendung von Nachrichtenwarteschlangen, die sprachneutral sind, und dann haben Sie wirklich Raum zum Wachsen!

Das gesagt, AMQP bemüht sich zu verstehen und möglicherweise mehr, als Sie bereit sind zu übernehmen, wenn Ihre App. funktioniert so gut wie es ist. YMMV.

+0

Ich bin ein großer Fan von Nachrichtenwarteschlangen, aber manchmal geht es weniger darum, eine Anwendung von sich selbst zu entkoppeln, als nur einen anderen Weg für verschiedene Teile der App zu benötigen, um mit sich selbst zu sprechen, und eine einfache, prozessinterne Lösung ist ein besser geeignet als die schwergewichtige Option eines echten Messaging-Middleware-Dienstes. Ein Vorteil der Auswahl der In-Process-Version ist, dass es immer noch relativ einfach ist, die Remotemessage später hinzuzufügen, indem ein Nachrichtenabonnent hinzugefügt wird, der die Nachricht serialisiert und an den Broker weiterleitet oder eine Verbindung mit dem Broker herstellt und die unserialisierte Nachricht wieder veröffentlicht verarbeiten. – SingleNegationElimination

1

Es gibt auch die Bibliotheken von PJ Eby, RuleDispatch und das PEAK-Projekt, speziell Trellis. Ich weiß nicht, was ihr Status eigentlich ist, aber die Mailingliste ist ziemlich aktiv.

Last version of Trellis on PyPi

Trellis doc

Ich habe auch die Komponenten aus dem Kamaelia project der BBC. Axon ist ein interessanter Ansatz, aber mehr Komponente als Publisher-Verbraucher inspiriert. Nun, die Website ist irgendwie nicht auf dem neuesten Stand ... Es gab ein oder zwei Projekte im Google SoC 2008 und es wird daran gearbeitet.

Sie wissen nicht, ob es :)

bearbeiten helfen: Ich habe gerade Py-notify, die eine „unorthodox“ Umsetzung des Observer-Muster ist. Es hat die meisten Funktionen, die ich für meine eigenen Werkzeuge brauche.

0

Allein die Tatsache, dass PyPubSub ein etwas chaotisch verwaltetes Projekt zu sein scheint (das Wiki auf SF ist tot, die Webseite (ein anderes Wiki), die auf SF verlinkt ist, wäre Grund genug, es nicht zu benutzen) . PyDispatcher hat eine intakte Website, aber die einzige Dokumentation, die sie zu bieten scheinen, ist die für die API, die aus den Docstrings generiert wird. Kein Verkehr auf der Mailingliste ... ein schlechtes Zeichen!

Wie Mike bereits erwähnte, ist es durchaus möglich, eine Lösung zu wählen, die unabhängig von Python ist. Versteh mich jetzt nicht falsch, ich Liebe Python, aber immer noch, in diesem Bereich kann es sinnvoll sein, ein Framework zu verwenden, das von der Programmiersprache entkoppelt ist.

Ich habe keine Erfahrung mit Messaging, aber ich habe vor, ein paar Lösungen zu sehen. Bisher diese beiden (kostenlos, Open Source) Projekte scheinen die vielversprechendste für mich zu sein (zufällig sind beide Projekte Apache):

Beide scheinen angemessen zu sein, ausgereifte Projekte, zumindest soweit es um Dokumentation und Community geht. Ich kann jedoch die Qualität der Software nicht kommentieren, da ich gesagt habe, dass ich keine Software benutzt habe.

Qpid wird mit Client-Bibliotheken für Python ausgeliefert, Sie können aber auch py-amqplib verwenden. Für ActiveMQ gibt es pyactivemq, mit dem Sie entweder über STOMP (Streaming Text Oriented Messaging Protocol) oder über Openwire verbinden können.

+0

Dies ist alt und hat keine Stimmen, aber es macht falsche Aussage über PyPubSub basierend auf hastigen Suche (falsche Website) und auf mögliche zukünftige Verwendung eher als aus erster Hand Erfahrung, am besten zu vermeiden, dass so tun, -1. Das OP zitiert von pubsub.sf.net (wie es damals war), aber deine Beschreibung zeigt an, dass du pypubsub.sf.net angeschaut hast, ein Projekt, das * mit dem fraglichen PyPubSub * nicht verwandt ist. PyPubSub @ pubsub.sf.net war (und ist immer noch) ein sehr starker Kandidat für die anwendungsbasierte ereignisbasierte Programmierung, mit vielen Dokumenten und Anwendungsbeispielen sogar damals und einzigartigen Funktionen wie Message-Dokumenten. – Schollii

2

Einige Bibliotheken, die ich gefunden habe, die noch nicht erwähnt:

3

Das beste Versandpaket für Python scheint die dispatch module innerhalb django zu sein (signals in der Dokumentation genannt). Es ist unabhängig vom Rest des Djangos und ist kurz, dokumentiert, getestet und sehr gut geschrieben.

Bearbeiten: Ich verzweigte dieses Projekt in eine independent signal project für Python.

+0

"Es ist unabhängig von dem Rest des Django ... " Anscheinend nicht: https://github.com/django/django/blob/master/django/dispatch/dispatcher.py#L71 –

+1

Es * ist * unabhängig von der Rest von Django. Entfernen Sie die markierte Zeile und Sie erhalten dieses unabhängige Paket: https://github.com/olivierverdier/dispatch –

+0

Bei meiner Suche stieß ich auch auf diese: https://github.com/theojulienne/PySignals, die das gleiche zu bieten scheint Ding. Und dies: https://github.com/11craft/louie, das ein "komplizierter" Nachkomme von PyDispatch zu sein scheint (für den ich keine Dokumentation finden konnte). Ich wollte dies untersuchen, aber wenn Sie eine Minute haben, was ist der Unterschied zwischen diesen Projekten? –

2

Hier ist eine neuere: https://github.com/shaunduncan/smokesignal. „smokesignal ist eine einfache Python-Bibliothek für das Senden und Empfangen von Signalen Er zieht Inspiration aus den django Signal Rahmen, sondern als Mehrzweck-Variante gemeint..“ Beispiel:

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()