Python的事件框架?

cul*_*rón 9 python events twisted message-queue

我正在构建一个与Web客户端(Django)和远程API(可能是一个独立的守护进程)一起工作的系统.我发现将它们的工作与JavaScript中的某些事件框架协调起来更容易.不幸的是,Django信号是同步的,这将使对客户端的回复非常慢.此外,我可能希望能够将守护程序或其部分迁移到单独的计算机,但仍以相同的方式工作(不是RPC,而只是触发事件或发送消息).(这听起来像是Erlang的方法.)

是否有一个框架可以使用经过验证的可靠方法在流程之间进行通信(例如,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)
Run Code Online (Sandbox Code Playgroud)

这里有更多细节.有一个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})
Run Code Online (Sandbox Code Playgroud)

同样,这不能仅仅使用Django信号来完成:某些事件需要通过网络发布,其他事件应该是本地的但是异步的.

可能有必要实例化一些东西,比如

from events_framework import Environment
env = Environment()  # will connect to default rabbitmq server from settings.
Run Code Online (Sandbox Code Playgroud)

mar*_*bdq 5

检查电路:轻量级事件驱动的异步应用程序框架,用于Python编程语言,具有强大的组件体系结构。


cul*_*rón 4

我认为CeleryRabbitMQ是最成熟的软件组合,我会坚持使用它们。Celery 不仅允许创建事件,还允许通过队列路由并行化进行灵活的专业化。