8

いくつかの数学的計算 (C で記述され、Cython モジュールを介して実行される) を実行する Django リクエストが多数ありますが、実行には不確定な時間 (1 秒程度) がかかる場合があります。また、リクエストはデータベースにアクセスする必要がなく、すべて互いに独立しており、Django からも独立しています。

現在、すべてが同期 (ワーカー型で Gunicorn を使用sync) ですが、これを非同期でノンブロッキングにしたいと考えています。要するに、私は何かをしたいと思います:

  1. AJAX リクエストを受け取る
  2. 使用可能なワーカーにタスクを割り当てます (メインの Django Web アプリケーションをブロックせずに)
  3. ワーカーは不明な時間でタスクを実行します
  4. Django は、タスクが完了するたびに、計算の結果 (文字列のリスト) を JSON として返します。

私は非同期 Django を初めて使用するので、これを行うのに最適なスタックは何かという質問があります。

この種のプロセスは、タスク キューが適しているものですか? Tornado + Celery + RabbitMQ、または他の何かを推奨する人はいますか?

前もって感謝します!

4

2 に答える 2

14

セロリはこれに最適です。

あなたがやっていることは比較的単純なので (読んでください: タスクのルーティング方法について複雑なルールは必要ありません)、おそらく Redis バックエンドを使用して問題を解決できます。つまり、RabbitMQ をセットアップ/構成する必要はありません。 (私の経験では、これはより困難です)。

私はCeleryのほとんどの開発ビルドでRedisを使用しています。これが私の設定の関連ビットです:

# redis をキューとして使用
BROKER_BACKEND = "kombu.transport.pyredis.Transport"
BROKER_HOST = "ローカルホスト"
BROKER_PORT = 6379
BROKER_VHOST = "0"

# 結果を redis に保存する
CELERY_RESULT_BACKEND = "レディス"
REDIS_HOST = "ローカルホスト"
REDIS_PORT = 6379
REDIS_DB = "0"

私も を使用しdjango-celeryています。これにより、Django との統合が快適になります。

より具体的なアドバイスが必要な場合はコメントしてください。

于 2010-12-27T04:52:33.573 に答える
0

非同期にすることを計画しているので (おそらく gevent などを使用して)、計算作業用にスレッド化/フォークされたバックエンド Web サービスを作成することも検討できます。

非同期フロントエンド サーバーは、すべての軽い作業を処理し、非同期に適したデータベース (特別なドライバーを使用した redis または mysql) からデータを取得することができます。計算を実行する必要がある場合、フロントエンド サーバーはすべての入力データをバックエンド サーバーが結果の計算を完了したら、結果を取得します。

フロントエンド サーバーは非同期であるため、結果を待っている間はブロックされません。セロリを使用する場合とは対照的に、これの利点は、結果が利用可能になるとすぐにクライアントに返すことができることです。

client browser <> async frontend server <> backend server for computations
于 2011-09-14T18:19:39.150 に答える