2012-06-22 78 views
9

我正在構建一個可以與Web客戶端(Django)和遠程API(可能是獨立守護進程)一起工作的系統。我發現使用JavaScript等一些事件框架來協調工作更容易。不幸的是,Django信號是同步的,這會使客戶回覆速度非常慢。另外,我可能希望能夠將守護程序或其部分遷移到單獨的機器,但仍以相同的方式工作(不是RPC,而只是觸發事件或發送消息)。 (這可能聽起來像Erlang的方法。)Python的事件框架?

是否有一個框架可以使用經過驗證且可靠的方法在進程之間進行通信(比如說RabbitMQ),並且需要最少的樣板文件?

至於Twisted,AndréParamés建議,我更喜歡簡單的代碼。這是可以扭曲的嗎?

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) 

這裏有更多的細節。有一個Django視圖文件使用一些模型並通知其他事件。還有一個獨立的守護進程腳本,可以無限運行並對事件作出反應。

這只是僞代碼,我只是說它應該是多麼容易。

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

同樣,這不能只是Django的信號做:一些事件需要通過網絡來發布,其它的應該是當地的,但異步的。

可能需要做一些實例,比如

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

你爲什麼標記這個'javascript'?這不是真的相關。至於事件驅動的框架,你見過[Twisted](http://twistedmatrix.com/trac/)嗎? –

+0

刪除了JS&Erlang標籤... –

+0

他們的hello世界示例讓我撓了腦袋。它需要多少樣板或怪異的代碼? –

回答

4

檢查circuits:輕量級事件驅動和異步應用框架爲具有較強的組件架構Python編程語言。

+0

作爲這個庫/框架的作者,我有點偏見;不過電路是圍繞組件架構和事件驅動的消息傳遞而設計的。 - 詹姆斯米爾斯/ prologic –