Фреймворк событий для Python? [закрытый]


Я создаю систему, которая работает с веб-клиентами (Django) и удаленными API (вероятно, автономный демон). Я вижу, что проще координировать свою работу с некоторыми событиями фреймворка, как в JavaScript. К сожалению, сигналы Django синхронны, что делает ответы клиентам очень медленными. Кроме того, я мог бы захотеть перенести демона или его часть на отдельную машину, но все равно работать так же (не RPC, а просто инициировать событие или отправлять сообщение). (Это может звучать как и подход Эрланга.)

Существует ли структура, которая использует проверенные и надежные способы связи между процессами (скажем, RabbitMQ) и требует минимальной шаблонности?

Что касается Twisted, который предложил Андре Парамес, я бы предпочел более простой код. Это выполнимо в 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)

Вот более подробная информация. Существует файл представлений 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.
3 9

3 ответа:

Check circuits : облегченная событийная и асинхронная Прикладная платформа для языка программирования Python с сильной компонентной архитектурой.

Я решил, что Сельдерей с RabbitMQ является наиболее зрелой программной комбинацией, и я буду придерживаться их. Сельдерей позволяет не просто создавать события, но и гибко специализироваться с помощью маршрутизации очередей и распараллеливания.

Django ztaskd - это способ вызова асинхронных задач из Django через ZeroMQ (через pyzmq ).