Как запускать апи Django асинхронно
У меня есть долго работающий API в Django. Когда пользователь1 обращается к этому API, другие API блокируются для пользователя1 до тех пор, пока не будет решен этот вызов API. Но в то же время для других пользователей эти API работают нормально.
class CreateOrderAPIView(APIView):
def post(self, request):
# Creates order
# Some third-party services are invoked (Takes so long)
return Response(order_data, status=201)
Пример
Теперь, когда вышеупомянутый API вызывается пользователем1, другие вызовы API блокируются для пользователя1 до тех пор, пока не завершится затянувшийся вызов. Однако другие пользователи могут вызывать API в то же самое время.
Я пока не хочу использовать подход celery/redis для своих долгосрочных задач.
Есть ли способ решить эту проблему?
Вы можете использовать встроенную библиотеку Python asyncio
. Вы можете создать асинхронную функцию для обработки длительной задачи и использовать asyncio.run()
для ее асинхронного выполнения внутри вашего представления API.
EXAMPLE
import asyncio
from rest_framework.response import Response
from rest_framework.views import APIView
class CreateOrderAPIView(APIView):
async def create_order_async(self, request):
# Simulate long-running task
await asyncio.sleep(5) # Example: Simulate a task that takes 5 seconds
# Generate order data
order_data = {"order_id": 123, "status": "created"}
return order_data
async def post(self, request):
# Execute the long-running task asynchronously
order_data = await self.create_order_async(request)
return Response(order_data, status=201)