8

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

是否有一个框架可以使用经过验证且可靠的方式在进程之间进行通信(例如 RabbitMQ),并且需要最少的样板文件?

至于 André Paramés 建议的 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.
4

3 回答 3

5

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

于 2012-06-25T10:08:01.593 回答
3

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

于 2012-06-27T04:43:01.397 回答
1

Django ztaskd是一种通过 ZeroMQ(通过pyzmq)从 Django 调用异步任务的方法。

于 2012-06-25T10:32:28.653 回答