2016-10-23 8 views
0

リクエストがある場合、まずdjangoで応答を返し、DBを更新するような作業を続けますか?Django - 応答を返してDBを更新します

これはパフォーマンス上の理由によるものです。ユーザーには非常に早い回答が得られますが、DBの更新には時間がかかります。

ありがとうございました。

答えて

1

あなたはenable-threads = trueでuwsgi使用している場合は、簡単な解決策は次のようになります。

import threading 

def myview(request): 
    obj = MyObj() 
    threading.Thread(target=save_to_db, args=(obj,)).start() 
    return ... 

def save_to_db(obj): 
    obj.save() 

あなたは、すべてのユーザーの要求をこのように処理したい場合、これは、その後、何らかの時折バックグラウンドタスクには十分ですメッセージキューはよりスケーラブルなソリューションになります。

0

1つのスレッドが応答を返し、2番目が応答を返すようにマルチスレッド化できます。もう1つの方法は、メッセージサービス(セロリ+ redis/rabbitmqの行に沿って)にそれを渡して、それがそのタスクを処理できるようにすることです。

+0

私は理解していることを確認する:ビューは新しいスレッドを作成する必要がありますか? –

1

私が現在調査中のもの:django channels メッセージをキューに入れてDBを更新し、その間に応答を送信することができます。その後、別のワーカーがそのメッセージを受け取り、作業を行います。 しかし、django-channelsはあなたのメッセージが失われないことを保証しません(最大で1回届きます)... DBの更新が非常に重要な場合は、より信頼できるものを探したいかもしれません。

はまだこれをテストしたことはありません...ただの思考

1

号定期Djangoはその応答を返すと、データベースを更新するために、純粋なDjangoのソリューション、そのことはできませんを使用して、要求 - 応答経路をたどります。

要件に応じて、DjangoチャネルやDjango-Celeryなどのメッセージブローカーシステムを調べることをお勧めします。

関連する問題