2012-06-22 27 views
9

Tôi đang xây dựng một hệ thống hoạt động với các máy khách web (Django) và các API từ xa (có thể là một daemon độc lập). Tôi thấy dễ dàng hơn trong việc phối hợp công việc của họ với một số khung sự kiện như trong JavaScript. Thật không may, tín hiệu Django là đồng bộ, điều này sẽ trả lời cho khách hàng rất chậm. Ngoài ra, tôi có thể muốn di chuyển daemon hoặc phần của nó sang một máy riêng biệt, nhưng vẫn hoạt động theo cùng một cách (không phải RPC, mà chỉ kích hoạt sự kiện hoặc gửi thư). (Điều này nghe có vẻ giống như cách tiếp cận của Erlang.)Khung sự kiện cho Python?

Có khuôn khổ nào sử dụng các cách được chứng minh và đáng tin cậy để giao tiếp giữa các quy trình (nói, RabbitMQ) và yêu cầu bản mẫu tối thiểu?

Đối với Twisted, André Paramés gợi ý, tôi thích mã đơn giản hơn. Đây có phải là doable trong 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) 

Dưới đây là các chi tiết khác. Có một tập tin xem Django sử dụng một số mô hình và thông báo cho người khác về các sự kiện. Và có một tập lệnh daemon độc lập chạy vô hạn và phản ứng với các sự kiện.

Đây chỉ là mã giả, tôi chỉ có nghĩa là dễ dàng như thế nào.

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

Một lần nữa, điều này không thể được thực hiện chỉ với tín hiệu Django: một số sự kiện cần được xuất bản qua mạng, một số sự kiện khác phải là cục bộ nhưng không đồng bộ.

Nó có thể là cần thiết để làm một cái gì đó nhanh chóng, giống như

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

Tại sao bạn gắn thẻ 'javascript' này? Nó không thực sự liên quan. Đối với một khung hướng sự kiện, bạn đã thấy [Xoắn] (http://twistedmatrix.com/trac/) chưa? –

+0

Đã xóa các thẻ JS & Erlang ... –

+0

Ví dụ thế giới xin chào của họ khiến tôi gãi đầu. Cần bao nhiêu mã soạn sẵn hoặc mã lạ? –

Trả lời

3

Tôi đã quyết định Celery với RabbitMQ là sự kết hợp phần mềm trưởng thành nhất và tôi sẽ gắn bó với chúng. Cần tây cho phép không chỉ tạo sự kiện mà còn chuyên môn hóa linh hoạt qua queue routingparallelization.

4

Kiểm tra circuits: một sự kiện Lightweight điều khiển và khung ứng dụng đồng bộ cho các ngôn ngữ lập trình Python với một phần Kiến trúc mạnh mẽ.

+0

Là tác giả của thư viện/khung này, tôi hơi thiên vị; tuy nhiên các mạch được thiết kế xung quanh một cấu trúc thành phần và thông điệp hướng sự kiện. --JamesMills/prologic –

Các vấn đề liên quan