我尝试使用 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 云解决方案!
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()
。