Django celery queue task

api View

class IsBuyNowAvailable(APIView):
    permission_classes = [RazorpayPermission]
    def post(self, request, format=None):
        data = request.data
        res = buy_now_available.delay(data)
        print("Celery res", res)


        if res.get("success"):
            return Response(res, status=status.HTTP_200_OK)
        else:
            return Response(res, status=status.HTTP_400_BAD_REQUEST)

задача селери

from celery import Celery
from settings.settings import CELERY_BROKER_URL

app = Celery("celery_app")
app.config_from_object("django.conf:settings", namespace="CELERY")
app.autodiscover_tasks()
        
@app.task()
def buy_now_available(data):
    asset_id         = data.get("asset_id")
    asset = Asset.objects.filter(id=asset_id).get()
    return {"success": True, "asset_id": asset.id}



web             | Celery res b926b9b1-a3cd-4461-a73f-5baf8f7e51c9

celery_1          | [2022-04-14 05:17:03,198: INFO/MainProcess] 
Task api.tasks.buy_now_available[b926b9b1-a3cd-4461-a73f- 
5baf8f7e51c9] received
 celery_1          | [2022-04-14 05:17:03,254: 
INFO/ForkPoolWorker-1] Task api.tasks.buy_now_available[b926b9b1- 
a3cd-4461-a73f-5baf8f7e51c9] succeeded in 0.05360425729304552s: 
{'success': True, 'asset_id': 425}

Здесь я могу видеть задачу в celery, но она возвращает id задачи и в celery генерируется ответ. Я хочу сделать так, чтобы он задерживался и ждал, пока ответ будет готов, и ответ должен приходить внутри моего представления, а не только в задаче celery, чтобы я мог отправить этот ответ пользователю .

Причина, по которой мне это нужно, заключается в том, что я реализую задачу очереди.

Если 10 пользователей обратились к этому api одновременно, то он будет ждать следующего пользователя, пока первый запрос не будет выполнен. и поместит остальные запросы в очередь до завершения первого запроса.

Пожалуйста, посмотрите и скажите мне, как я могу этого добиться

Вернуться на верх