2017-06-21 2 views
6

Ich erstelle ein Projekt in Python und ich möchte ein Überwachungssystem hinzufügen, das Ereignisse und Event-Handler verwendet. Ich möchte, dass dieses System während des gesamten Projekts verfügbar ist. Ich habe die folgenden Operationen im Hinterkopf:Überwachungssystem mit Ereignissen in Python

  • Definieren eines Ereignisses. Das Ereignis kann einige Daten als Parameter aufnehmen.
  • Definieren eines Monitors. Ein Monitor registriert sich für ein bestimmtes Ereignis. Mehrere Monitore können sich für dasselbe Ereignis registrieren. Ich möchte verschiedene Arten von Monitoren erstellen, z. eine, um Daten zu drucken, eine, um Plots mit den Daten zu erzeugen, usw. Somit sollte ein Monitor eine Klasse sein, die alle gesammelten Daten aufnehmen kann, bis eine Methode (z. B. Drucken, Erstellen-Loggen, ...) aufgerufen wird.
  • Definieren eines Event-Handlers für ein Monitor-Event-Paar. Dies definiert, wie der angegebene Monitor auf das gegebene Ereignis reagiert. Diese Aktion wird hauptsächlich lauten: Fügen Sie diese Daten zur Datenliste der Instanz einer bestimmten Monitorklasse hinzu.
  • Eine Benachrichtigungsfunktion, die benachrichtigt werden kann, wenn ein Ereignis aufgetreten ist. Dies löst den Event-Handler für alle Monitore aus, die für dieses Ereignis registriert sind. Im Idealfall sollte die Benachrichtigungsfunktion von überall im Projekt aufgerufen werden können.

Wie kann ich ein solches System erstellen? Gibt es Bibliotheken, die mir dabei helfen können? Ich frage mich besonders, wie ich dieses System so gestalten kann, dass es während des gesamten Projekts transparent verfügbar ist.

+1

Ist das etwas, Link zu Ihrer Notwendigkeit entsprechen? https://StackOverflow.com/Questions/1092531/Event-System-in-Python –

+0

@LudovicGuerra Dies ist sicherlich hilfreich, z. Blinker sieht gut aus. Aber ich suche den Handler, um eine Klasse und keine einfache Funktion zu sein. In dieser Klasse würde ich alle Daten sammeln und dann eine Funktion aufrufen, z. um in CSV zu exportieren oder ein Diagramm der protokollierten Daten zu erstellen. – JNevens

Antwort

2

Sie können die meisten tun, was Sie mit vierzig Zeilen Python-Code wollen. Dies ist mein eigenes Design, das ich die ganze Zeit benutze. Die Funktionsnamen sind so gewählt, dass sie einen Drop-In-Ersatz für die "Signale" und "Slots" von Qt darstellen.

Es ist einfach zu bedienen. Sie erstellen eine PSignal. Sie registrieren Handler, indem Sie die Methode connect aufrufen. Ein Handler kann aufrufbar sein. Wenn ein Ereignis auftritt, geben Sie ein Signal aus (d. H. Melden ein Ereignis), indem Sie die Funktion emit aufrufen. Jeder registrierte Callable läuft an diesem Punkt. Das Objekt, das emit aufruft, weiß nicht, oder kümmert sich nicht, ob jemand zuhört oder was passiert, wenn sie es sind.

Sie können einen Handler auch trennen.

Es gibt eine Menge Debugging-Code, weil ich entdeckt habe, dass andere bestimmte Fehler schwer zu finden sind.

In Ihrer Frage wollte jeder Handler ein Monitor sein, und in meinem Design Handler sind nur Funktionen. Aber es scheint mir, dass Ihr "Monitor" -Konzept unabhängig vom Event/Handler-Mechanismus ist. Sie müssen Funktionen schreiben, um Ihre Anwendung zu starten, und es sollte ziemlich einfach sein, diese Funktionen Ihre Monitore aufzurufen.

Der Code wurde ausführlich mit Python 3.3 getestet.

0

Sie können Ihr eigenes System mit einem verteilten Messaging-System wie zmq und dem "Publisher Subscriber" -Muster erstellen.

Ich habe so etwas wie gemacht, dass ein anpassbare Workflow-Engine Aufbau (Flow, https://github.com/mastro35/flows)

Bye D.