如何将 asyncio 与 django Rest api 框架一起使用,就像 jquery 承诺的工作方式一样,以便响应不需要等待

Ash*_*aka 1 python django asynchronous django-rest-framework python-asyncio

我在 python 3.7 上运行 django 2.2.3。我想要一个带有 asyncio 的解决方案,以便 api 可以只调用异步函数并返回响应,而无需等待我们使用 jquery Promise 执行操作的方式。定义my_coro只是举例。我将运行moviepy通常需要 40-50 秒才能完成的功能。我不希望 api 等待那么长时间才能发送响应。我也对如何处理线程池感到困惑。这里如何使用线程池呢?因为我也打算让电影迭代更快。那么如何创建一个处理调用的池my_coro呢?

async def my_coro(n):
    print(f"The answer is {n}.")

async def main(): 
    await asyncio.gather(my_coro(1),my_coro(2),my_coro(3),my_coro(4))

class SaveSnaps(APIView):
    def post(self, request, format = None):
        if request.user.is_anonymous:
            return Response({"response":"FORBIDDEN"}, status = 403)
        else:
            try:
                asyncio.run(main())
                return Response({"response": "success"}, status = 200)
            except Exception as e:
                return Response({'response':str(e)}, status = 400) 
Run Code Online (Sandbox Code Playgroud)

更新: 我尝试使用芹菜。但由于我不会使用周期性任务,实际上我需要异步接收 blob 数组作为参数的方法。celerytask.delay给我一个错误,因为任务需要可序列化的参数。所以我回到了这一点。我不确定我是否应该坚持使用线程解决方案或其他解决方案。

更新:我忘了分享我最后做了什么。我转移到celery. 但由于预期celery,我将保存部分移至同步方法,该方法完成后,将 moviepy 任务移交给运行任务。task.delayserialized paramsblobcelery

Rad*_*deh 5

据我所知,asyncio将同时处理您的代码,但您的应用程序仍将等待asyncio的执行完成,然后继续在您的应用程序内执行。

如果您希望您的应用程序在后台运行代码并继续执行,类似于JS 中的Promises,您需要考虑使用例如使用Celery 的作业调度或类似的东西。

这是使用 Django 和 Celery 的简单指南。