私はInstagramを模倣したDjangoアプリを持っており、写真やムービーをアップロードしてファンにその写真を通知します。Celeryを使ってDjangoでタスクを非同期的に実行する正しい方法
現在、通知を送信するために、ユーザーが写真をアップロードするとすぐに、アップロード者が持っているすべてのファンを繰り返し、通知をリストに追加してからbulk_create
オブジェクトに追加します。次のように:
fans = UserFan.objects.filter(star=user).values_list('fan',flat=True)
fan_list = []
for fan in fans:
fan_list.append(PhotoObjectSubscription(viewer_id=fan, which_photo=photo, updated_at=time, seen=False, type_of_object='1'))
PhotoObjectSubscription.objects.bulk_create(fan_list)
シンプルなもの。私もsupervisord
を私のアプリケーションのVMにインストールしました。ここでは、celery
(メッセージブローカーとしてredis
)経由でいくつかの基本タスクを実行します。
ここでは、上記のbulk_create
タスクをcelery task
として実行します。非同期に。私のbulk_create
コードは、写真のアップロードを処理するために使用されるビューと同じビューに存在するため、非同期に処理すると、そのプロセスがスピードアップします。
私はcelery
タスクに新しくなっています。したがって、上記のbulk_create
タスクをcelery
タスクにどのように変えることができるのか説明できる例がありますか?私は研究を行って、そしてここで私は私が行う必要があると思う何ました:
1)bulk_create
文の末尾にdelay()
を追加します:tasks.py
で
PhotoObjectSubscription.objects.bulk_create(fan_list).delay()
2)、プロセスに新しいタスクを追加します上記:
@task
def bulk_create_notifications():
PhotoObjectSubscription.objects.bulk_create(fan_list)
3)タスクが定期的な作業ではありませんから、settings.py
にCELERYBEAT_SCHEDULE
に何も追加する必要はありません。
私はおそらく完全に正確ではないので、助けてください。
いいえ、あなたのコードを誤読していました。私はすでに答えでそれを変更しました。モデルインスタンスを渡すことはできません!あなたのdev envでCELERY_ALWAYS_EAGERが 'True'に設定されているときにうまく動作するかもしれませんが、実際にはパラメータがキューを通過してしまいます。 – schwobaseggl
@HassanBaig実際には、あなたのコードの 'fans'は' ListList'にキャストしてタスクに渡す 'ValuesListQuerySet'です。 – schwobaseggl
私はこれを試して、ちょっとあなたに戻ってきます! –