8

Webクライアント(Django)とリモートAPI(おそらくスタンドアロンデーモン)で動作するシステムを構築しています。JavaScriptのようないくつかのイベントフレームワークと彼らの仕事を調整する方が簡単だと思います。残念ながら、Djangoシグナルは同期しているため、クライアントへの応答が非常に遅くなります。また、デーモンまたはその一部を別のマシンに移行できるようにしたい場合もありますが、それでも同じように機能します(RPCではなく、イベントのトリガーまたはメッセージの送信のみ)。(これはErlangのアプローチのように聞こえるかもしれません。)

プロセス間で通信するための実証済みの信頼できる方法(たとえば、RabbitMQ)を使用し、最小限の定型文を必要とするフレームワークはありますか?

AndréParamésが提案した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 に答える