Django Asyc 函数执行

问题描述 投票:0回答:1

我尝试使用 Django DRF APIView 以异步模式执行函数,以便 API 立即返回响应。我正在使用 Django 4.1.12,adrf 用于异步视图。下面是代码:

import asyncio
from asgiref.sync import sync_to_async
from adrf.views import APIView

def sensitive_sync_function():
 count = 0
 while True:
   count = count + 1
   print("Running in Async mode !")
   time.sleep(1)
   if count == 10:
     print("Processing done !")
     break
return None

class AsyncGroupManagementView(APIView):

  async def get(self, request, format=None):

     async_function = sync_to_async(sensitive_sync_function)
     return Response(response, status=status.HTTP_200_OK, headers=headers)

Api 调用成功执行并返回响应,但我不确定是否执行了sensitive_sync_function(),因为我无法在终端上看到任何日志。我稍后必须显式执行此任务吗?

我的最终目标是在异步模式下运行该函数,以便返回 API 响应并且该函数继续在后台执行。这是正确的方法还是我应该在这里使用芹菜?

也欢迎任何适用于此场景的AWS 云解决方案

django amazon-web-services asynchronous django-rest-framework django-4.1
1个回答
0
投票

sync_to_async
函数基本上是一个装饰器。当你给它一个函数时,它会返回一个包装的异步函数。

但是你仍然需要自己执行返回的

async_function

async def get(self, request, format=None):
    async_function = sync_to_async(sensitive_sync_function)
    # now execute it
    await async_function()

附注

time.sleep()
将阻塞事件循环。您应该在异步应用程序中使用
asyncio.sleep()

© www.soinside.com 2019 - 2024. All rights reserved.