51

私には、likeソーシャルネットワークのような機能や親指を立てる機能があります。ユーザーは星/ハート/何でもクリックしてコンテンツをいいねとしてマークします。これはajaxで行われ、高速である必要があります。

ここでの唯一の問題は、いくつかの理由でそれぞれに対していくつかのタスクを実行する必要がありlike、それらがビューでまっすぐにコーディングされてlikeいるために遅くなることがわかりました。

シグナルを使用してこれらのタスクの実行を非同期にして、タスクが終了するのを待たずにビューがjsonすぐにに返送できるようにすることを考えています。javascript

のシグナルの作成を開始しましたlikeが、Djangoは非同期ではなく、最終的には同じになることに気付きsignalsました。ビューは、シグナルが終了して応答を返すのを待つ必要があります。

それで、signalあちこちで説明されているように非同期にすることもできますpost_saveが、モデルの信号を使用するlikeこともできますが、信号が実行される前にビューを終了できるかどうか疑問に思います。

4

4 に答える 4

53

セロリ(またはより具体的には django-celery )も調べてください。非同期タスク スケジューラ/ハンドラです。したがって、post_save シグナル ハンドラーはタスクを作成し、それはセロリを介して取得および実行されます。こうすることで、別のマシンまたはマシンのバッチであっても、重い作業を非同期で実行しながら、高速なアプリケーションを維持できます。

于 2012-08-11T13:57:11.260 に答える
30

あなたが欲しいのはスレッドです。とても使いやすいです。サブクラスthreading.Thread化してメソッドを書くだけですrun:

import threading

class LikeThread(threading.Thread):
    def __init__(self, user, liked, **kwargs):
        self.user = user
        self.liked = liked
        super(LikeThread, self).__init__(**kwargs)

    def run(self):
        # long running code here

次に、タスクを実行する準備ができたら、次のように開始します。

LikeThread(request.user, something).start()

ビュー コードの残りの部分などは、再開して応答を返します。スレッドは、完了するまで作業を喜んで実行し、終了します。

完全なドキュメントを参照してください: http://docs.python.org/library/threading.html

于 2012-08-10T14:53:38.843 に答える
8

まず第一に、Django のシグナルは非同期ではありません。post_saveあなたの特定のケースでは、間違った方法だと思います。最も簡単な方法は、単に ajax リクエストを発行して、好きなアクションを実行し、応答を待たずに表示することです。代わりに、リクエストを発行した直後に view/html を変更してください。

もちろん、ユーザーがこのアイテムを気に入ることが許可されており、リクエストが失敗しないことを事前に知っておく必要があります。

于 2012-08-10T09:59:32.870 に答える