你知道 Python 的 Django 是异步的 Web 框架吗?

前几天有个问题,就是要在 View 里面调用短信 API,刚开始想,要调短信的 API 就需要用到异步请求了,要不然就会阻塞,因为测试就去调用短信 API 感觉不太好,于是乎就写了两个 View,一个 sleep10 秒一个 sleep5 秒,先访问 10 秒的在访问 5 秒的,最后就呵呵呵呵了,5 秒的先返回,过了 5 秒返回 10 秒的 Vie,总耗时 10 秒。

艹,为什么会这样?马上 pip 一个 tornado,同样两个 View 一个 sleep5 秒一个 sleep10 秒,然后同时访问,结果就是 10 秒之后返回第一个请求,5 秒之后返回第二个请求,总耗时 15 秒。

在我的理解总,Web 框架都是单进程单线程的,默认应该是同步的,为什么 Django 是异步的?如果是这样,那么那些用 redis+celery 来处理异步任务的不是脑袋都进水了?

结论就是 Django 就是异步的框架,那还要 Tornado 干嘛?

求打醒


你知道 Python 的 Django 是异步的 Web 框架吗?

11 回复

不,让你睡着多好。活在自己的梦里,美滋滋。

看你发帖,内容里面的语气,不想解释你的问题


Django 本身是一个同步 Web 框架,其核心架构(如 ORM、视图处理)是围绕同步模型设计的。不过,从 Django 3.1 开始,它引入了对异步视图(async def)和中间件的实验性支持。Django 4.x 版本进一步增强了异步能力,例如支持异步 ORM(部分查询)、异步缓存等,但整体上异步支持仍在完善中,并非所有组件都已完全异步化。

如果你需要构建高性能的异步 Web 服务,可以考虑以下方案:

  1. 在 Django 中使用异步视图:适用于 I/O 密集型操作(如调用外部 API),但需注意同步 ORM 调用会阻塞事件循环。
    # 示例:异步视图
    from django.http import JsonResponse
    import asyncio
    
    async def async_view(request):
        # 模拟异步 I/O 操作
        await asyncio.sleep(1)
        return JsonResponse({"message": "Hello Async Django!"})
    
  2. 搭配 ASGI 服务器:使用 Uvicorn 或 Daphne 部署,以支持异步请求。
  3. 混合异步/同步:通过 sync_to_async 包装同步代码(如 ORM 操作),但可能影响性能。
  4. 考虑纯异步框架:若项目重度依赖异步,可评估 FastAPI 或 Starlette,它们原生支持异步且性能更优。

总结:Django 的异步功能正在演进,但尚未完全成熟。

开发环境 Django 是多线程的。Google 一下就出来了(我都没用过 Django )

。。。

太多人像你一样以为用了 tornado 就是异步了。。。。。

快醒醒

同意!

你是不是傻,web 框架的请求当然是多线程的啊,不然多人同时访问网站岂不是得一个个等?

首先你的态度和你的基础一样, 然后我敢肯定你在 tornado 里是用的 time.sleep,其次 tornado ,Django, celery, redis 这些我恐怕你只是看过,最多就是敲了两行 demo

google: tornado 如何正确 sleep

貌似大家都喜欢谦逊低调又厉害的人

回到顶部