4

Django アプリの設計に関する新規の質問:

Web サイトのレポート エンジンを構築しています。そして、私は大量の(そして時間とともに大きくなる)データと、それに適用する必要があるいくつかのアルゴリズムを持っています。計算はリソースを大量に消費することが約束されており、ユーザーの要求によって実行されるのはばかげています。したがって、それらをバックグラウンド プロセスに入れることを考えています。これは継続的に実行され、時々結果を返します。これは、要求に応じて HTML 出力を生成するための Django ビュールーチンにフィードできます。

そして私の質問は、そのようなシステムを構築するための適切な設計アプローチは何ですか? 何かご意見は?

4

3 に答える 3

3

セロリはあなたの最良の選択の1つです。正常に使用しています。強力なスケジューリングメカニズムがあります。タスクを時間指定ジョブとしてスケジュールするか、ユーザーが要求したときにバックグラウンドでタスクをトリガーすることができます。

また、そのようなバックグラウンドタスクのステータスを照会する方法を提供し、多くのフロー制御機能を備えています。これにより、作業の分散が非常に簡単になります。つまり、セロリのバックグラウンドタスクを別のマシンで実行できます(これは、たとえば、Webプロセスがリクエストごとに最大30秒に制限されているheroku Web /ワーカー分割で非常に便利です)。さまざまなキューバックエンドを提供します(データベース、rabbitMQ、または他の多くのキューイングメカニズムを使用できます。最も簡単なセットアップで、Djangoサイトがすでに使用しているのと同じデータベースを使用できます(セットアップが簡単になります)。

また、自動テストを使用している場合は、テストに役立つ機能もあります。バックグラウンドタスクがバックグラウンドで実行されない「イーガー」モードに設定できるため、予測可能なロジックテストが可能になります。

詳細はこちら:http ://docs.celeryproject.org:8000 / en / latest / django /

于 2012-12-29T13:06:16.127 に答える
0

実行するたびに実行する必要があるあらゆる種類の計算をトリガーし、そのURLを取得するか、サーバー上のcronjobを介してそのスクリプトを実行するURLまたはPythonスクリプトを用意しないのはなぜですか? あなたの質問からすると、それ以上のものは必要ないようです。

于 2012-12-09T00:25:17.647 に答える
0

結果がデータベースに返されるということですか、それとも独立して実行しているコードから直接 django-views を作成したいですか?

大量のデータがある場合は、 Pythons を使用するのが好きmultiprocessingです。JoinableQueue実行するさまざまなタスクと、さまざまなタスクを消費するワーカーのプールで満たすジェネレーターを作成できます。このようにして、システムのリソース使用率を最大化できるはずです。

マルチプロセッシング モジュールを使用すると、ネットワーク経由でいくつかのタスクを実行することもできます (例: multiprocessing.Manager())。これを念頭に置いておけば、データを時間内に処理するために 2 台目のマシンが必要な場合でも、簡単にスケールアップできるはずです。

例:

この例は、複数のプロセスを生成する方法を示しています。ジェネレーター関数は、重い作業が必要なすべての新しいエントリについてデータベースにクエリを実行する必要があります。コンシューマはキューから個々のアイテムを取得し、実際の計算を行います。

import time 

from multiprocessing.queues import JoinableQueue
from multiprocessing import Process

QUEUE = JoinableQueue(-1)

def generator():
    """ Puts items in the queue. For example query database for all new, 
    unprocessed entries that need some serious math done.."""
    while True: 
        QUEUE.put("Item")
        time.sleep(0.1)


def consumer(consumer_id):
    """ Consumes items from the queue... Do your calculations here... """
    while True: 
        item = QUEUE.get()
        print "Process %s has done: %s" % (consumer_id, item)
        QUEUE.task_done()


p = Process(target=generator)
p.start()

for x in range(0, 2): 
    w = Process(target=consumer, args=(x,))
    w.start()

p.join()
w.join()
于 2012-12-08T19:21:10.323 に答える