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 одновременно, то он будет ждать следующего пользователя, пока первый запрос не будет выполнен. и поместит остальные запросы в очередь до завершения первого запроса.
Пожалуйста, посмотрите и скажите мне, как я могу этого добиться