2012-06-22 11 views
9

Sto costruendo un sistema che funziona con i client Web (Django) e le API remote (probabilmente un daemon standalone). Vedo che è più facile coordinare il loro lavoro con alcuni framework di eventi come in JavaScript. Sfortunatamente, i segnali di Django sono sincroni, il che renderà le risposte molto lente ai clienti. Inoltre, potrei voler migrare il daemon o la sua parte su una macchina separata, ma funziona sempre allo stesso modo (non RPC, ma semplicemente attivando un evento o inviando un messaggio). (Potrebbe sembrare l'approccio di Erlang.)Framework di eventi per Python?

Esiste un framework che utilizzi metodi comprovati e affidabili per comunicare tra processi (ad esempio, RabbitMQ) e richiedere un numero di piastre minimo?

Per quanto riguarda Twisted, suggerito da André Paramés, preferirei un codice più semplice. Questo è fattibile in Twisted?

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) 

Ecco ulteriori dettagli. C'è un file di viste Django che utilizza alcuni modelli e notifica altri di eventi. E c'è uno script daemon standalone che funziona all'infinito e reagisce agli eventi.

Questo è solo codice pseudo, intendo solo quanto sia facile.

# 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}) 

Ancora una volta, questo non poteva essere fatto solo con i segnali di Django: alcuni eventi devono essere pubblicati sulla rete, gli altri dovrebbero essere locale, ma asincrona.

Potrebbe essere necessario fare un'istanza di qualcosa, come

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

Perché hai taggato questo 'javascript'? Non è davvero correlato. Per quanto riguarda un framework basato su eventi, hai visto [Twisted] (http://twistedmatrix.com/trac/)? –

+0

Rimosso i tag JS & Erlang ... –

+0

Il loro esempio di buongiorno mi ha fatto grattarmi la testa. Quanta caldaia o codice strano richiede? –

risposta

3

Ho deciso che Celery con RabbitMQ è la combinazione software più matura, e mi attaccherò a loro. Celery consente non solo la creazione di eventi, ma la specializzazione flessibile tramite queue routing e parallelization.

4

Controllare circuits: un evento leggero guidato e asincrono Application Framework per il linguaggio di programmazione Python con una forte componente di Architettura.

+0

Come autore di questa libreria/framework sono un po 'di parte; tuttavia i circuiti sono progettati attorno all'architettura di un componente e al passaggio di messaggi guidati dagli eventi. --JamesMills/prologic –

Problemi correlati