実行するDjangoリクエストがたくさんあります実行に時間がかかる可能性がある(1秒のオーダーで)いくつかの数学的計算(Cで書かれ、Cythonモジュールを介して実行される)。また、リクエストはデータベースにアクセスする必要はなく、すべて互いに独立していますし、Djangoからも独立しています。
今はすべて同期しています(Gunicornを使って sync
(ワーカータイプ)しかし私はこれを非同期でノンブロッキングにしたいのです。要するに私は何かをしたいのですが:
- AJAXリクエストを受信する
- 利用可能なワーカーにタスクを割り当てます(メインのDjango Webアプリケーションをブロックせずに)
- 労働者が未知の時間内にタスクを実行する
- Djangoはタスクが完了するたびに計算結果(文字列のリスト)をJSONとして返します
私は非同期Djangoにとても慣れていないので、私の質問はこれを実行するための最良のスタックが何であるかということです。
この種のプロセスは、タスクキューに適したものですか。誰かがTornado + Celery + RabbitMQ、またはおそらく他に何かを推薦しますか?
前もって感謝します!
回答:
回答№1は14セロリはこれに最適です。
あなたがしていることは比較的簡単なので(読む:タスクのルーティング方法に関する複雑なルールは必要ありません)、おそらくRedisバックエンドを使用しなくても済むかもしれません。難しい)。
私はRedisを最も開発したCeleryのビルドで使っています、そしてここに私の設定の関連ビットがあります:
#キューとしてredisを使う BROKER_BACKEND = "こんぶ。transport.pyredis.Transport " BROKER_HOST = "localhost" BROKER_PORT = 6379 BROKER_VHOST = "0" #結果をredisに保存する CELERY_RESULT_BACKEND = "redis" REDIS_HOST = "localhost" REDIS_PORT = 6379 REDIS_DB = "0"
私も使用しています django-celery
これはDjangoとの統合を幸せにします。
もっと具体的なアドバイスが必要な場合はコメントしてください。
回答№2の場合は0
非同期にすることを計画しているので(おそらくgeventのようなものを使用して)、計算作業のためにスレッド/フォークバックエンドWebサービスを作成することも検討できます。
非同期フロントエンドサーバーはすべてを処理できます。計算が行われなければならないとき、フロントエンドサーバはすべての入力データをバックエンドサーバにポストして、その結果を取得することができます。バックエンドサーバーはそれを計算し終えます。
フロントエンドサーバーは非同期なので、フロントエンドサーバーは非同期です。結果を待っている間ブロックします。セロリを使用するのとは対照的に、これの利点は、使用可能になったらすぐに結果をクライアントに返すことができることです。
client browser <> async frontend server <> backend server for computations