【问题标题】:Execute code after Response using Django's Async Views使用 Django 的异步视图在响应后执行代码
【发布时间】:2020-11-25 21:03:51
【问题描述】:

在 Django 视图返回响应后,我正在尝试执行一个长时间运行的函数(例如:sleep(30))。我已经尝试实施针对类似问题提出的解决方案:

但是,当使用像 gunicorn 这样的 WSGI 服务器时,客户端的页面加载只有在长时间运行的函数完成运行后才能完成。

既然 Django supports asynchronous views 可以异步运行长时间运行的查询吗?

【问题讨论】:

    标签: django python-asyncio


    【解决方案1】:

    显然,我正在寻找关于同一问题的解决方案,打开一个应该启动后台任务并向客户端发送响应的视图,而无需等到启动的任务完成。 据我了解,这不是 Django 中异步视图的目标之一。问题是所有执行的代码都连接到worker开始处理http请求。如果将响应发送回客户端,则工作人员无法再处理在视图异步中启动的任何其他代码/任务。因此,所有的异步函数都需要在前面加上一个“await”。因此,只有在等待的功能完成时,视图才会将其响应发送给客户端。

    据我了解,所有后台任务都必须推送到任务队列中,以便其他工作人员可以捕获每个新任务。有几种解决方案,例如 Djangp Channels 或 Django Q。但是,我不确定最轻量级的解决方案是什么。

    【讨论】:

    • 感谢@Mike42 的回答!我目前正在使用 django-q,但想要一些不需要额外服务来运行的东西。看起来 asyc 视图不是答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    相关资源
    最近更新 更多