2012-06-22 7 views
9

Ich baue ein System, das mit Web-Clients (Django) und Remote-APIs arbeitet (wahrscheinlich ein eigenständiger Daemon). Ich sehe, dass es einfacher ist, ihre Arbeit mit einem Ereignis-Framework wie in JavaScript zu koordinieren. Leider sind Django-Signale synchron, was die Antworten auf die Clients sehr langsam macht. Außerdem möchte ich vielleicht den Daemon oder sein Teil auf einen separaten Rechner migrieren können, aber immer noch auf die gleiche Weise arbeiten (nicht RPC, sondern nur ein Ereignis auslösen oder eine Nachricht senden). (Dies klingt nach Erlangs Vorgehensweise.)Ereignisrahmen für Python?

Gibt es ein Framework, das erprobte und zuverlässige Methoden zur Kommunikation zwischen Prozessen (z. B. RabbitMQ) verwendet und minimale Voreinstellungen erfordert?

Für Twisted, dass André Paramés vorgeschlagen, würde ich einen einfacheren Code bevorzugen. Ist das in Twisted machbar?

from events_framework import subscribe, trigger 
from django.http import Client 
http_client = Client() # just a sample 

@subscribe('data_received'): 
def reply(data): 
    http_client.post('http://www.example.com', data) 
    trigger('data_resent', data) 

Hier sind weitere Details. Es gibt eine Django-Sichten-Datei, die einige Modelle verwendet und andere über Ereignisse informiert. Und es gibt ein Standalone-Daemon-Skript, das unendlich läuft und auf Ereignisse reagiert.

Dies ist nur Pseudocode, ich meine nur, wie einfach es sein sollte.

# django_project/views.py (a Django views file) 
from events_framework import publish, subscribe 
from annoying import 

@subscribe('settings_updated') 
def _on_settings_update(event): # listens to settings_updated event and saves the data 
    Settings.object.get(user__id=event.user_id).update(event.new_settings) 

@render_to('form.html') 
def show_form(request): # triggers 'form_shown' event 
    publish('form_shown', {'user_id': request.user.id, 'form_data': request.GET}) 
    return {...} 


# script.py (a standalone script) 
from events_framework import publish, subscribe 

@subscribe('form_shown') 
def on_form_shown(event): # listens to form_shown event and triggers another event 
    pass 
    result = requests.get('third party url', some_data) 
    publish('third_party_requested', {'result': result}) 

Auch dies konnte nicht nur mit Django Signale erfolgen: einige Ereignisse über das Netzwerk veröffentlicht werden müssen, andere sollten aber asynchrone lokal sein.

Es kann notwendig sein, etwas zu tun instanziiert, wie

from events_framework import Environment 
env = Environment() # will connect to default rabbitmq server from settings. 
+5

Warum haben Sie dieses 'javascript' markiert? Es ist nicht wirklich verwandt. Haben Sie für ein ereignisgesteuertes Framework [Twisted] (http://twistedmatrix.com/trac/) gesehen? –

+0

Die JS & Erlang Tags wurden entfernt ... –

+0

Ihr Hallo Welt-Beispiel ließ mich den Kopf kratzen. Wie viel Boilerplate oder seltsamer Code benötigt es? –

Antwort

3

Ich entschied Celery mit RabbitMQ ist die ausgereifteste Softwarekombination, und ich bleibe bei ihnen. Sellerie ermöglicht nicht nur die Erstellung von Events, sondern auch die flexible Spezialisierung über queue routing und parallelization.

4

prüfen circuits: ein Leichte Event Driven und Asynchronous Application Framework für die Programmiersprache Python mit einem starken Component Architecture.

+0

Als Autor dieser Bibliothek/Framework bin ich ein wenig voreingenommen; Trotzdem ist Circuits um eine Komponentenarchitektur und ereignisgesteuerte Nachrichtenübergabe herum konzipiert. - James Mills/Prologic –