1

重要ではありませんが、これはこの質問のフォローアップです。

データベース内の各オブジェクトが表示された回数を数えたいと考えています。Personいくつかのインスタンスを持つモデルがあるとしましょう。Personデータベースの書き込みを待たないように Django Celery を使用して、各インスタンスがモデルで表示された回数のカウンターを保持したいと考えています。

現時点では、私はこれをやっています:

from celery.decorators import task

class Person(models.Model):
    name = models.CharField(max_length=50)


class Stats(models.Model):
    person = models.ForeignKey('Person', unique=True)
    @task
    def addView(self):
        se = StatEvent()
        se.save()
        self.views.add(se)

class StatEvent(models.Model):
    date = models.DateTimeField(auto_now_add=True)

次に、人のページをリストするビューが呼び出されるたびに、すべての人を取得し、次のように統計を更新します。

person.get_stats().addView.delay(person.get_stats())

その後、ブラウザに表示される人物のリストを返します。統計の更新は非同期で行われると思っていましたが、ページが表示されるまでに明らかに長い遅延がありprint、Celery コマンド ウィンドウに追加ごとにステートメントが表示されることで確認できます。ページは、最後の統計が更新された後にのみレンダリングされます。

ユーザーがデータベースの更新が完了するのを待たないようにするにはどうすればよいですか?

アップデート

一人一人を処理するにはワーカープロセスが足りていないことが関係しているのではないかと考えたので、代わりに人のリストをパラメーターとして受け取る関数を作成し、これを実行するタスクとして使用しました。したがって、キュー内のタスクは 1 つだけです。

@task(ignore_result=True)
def addViews(persons):
    for person in persons:
        stats = listing.get_stats()
        se = StatEvent()
        se.save()
        stats.views.add(se)

ただし、コンソールに出力すると、次のようになります。

    print "adding"
    print tasks.addClicks(persons)
    print "done"

次に、「追加」ステップと「完了」ステップの間に明確な遅延があり、関数の戻り値は ですNone

4

1 に答える 1

1

十分な労働者がいないという私の最初の疑いは正しかったことが判明しました。.delayすべてを 1 つのタスクにまとめた新しい関数が問題を解決しました。最後のtasks.addClicks(persons)呼び出しで を見逃していました。

于 2011-01-23T21:48:59.357 に答える