【Python基础】http请求是同步还是异步?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【Python基础】http请求是同步还是异步?相关的知识,希望对你有一定的参考价值。

参考技术A 同步的
一般http请求都是同步,意味着你调用网络时候必须等着结果返回不能干别的事
如果是异步需要自己包装,也有这样的库了

Django是同步的还是异步的?

【中文标题】Django是同步的还是异步的?【英文标题】:Django is synchronous or asynchronous? 【发布时间】:2020-02-21 04:34:22 【问题描述】:

Django 是同步的还是异步的? 我想知道 Django 框架是同步的还是异步的。 我听说过他们问的关于你使用的框架是同步还是异步的面试问题。所以想知道Synchronous and Asynchronous在web开发中的含义。

【问题讨论】:

Django 是同步的。 【参考方案1】:

Django 本身是同步的。

每个 HTTP 请求都将完全同步处理。

但是,您有 django-channels (https://github.com/django/channels) 之类的扩展,它们是异步的,适用于 Web 套接字 / 等。

这有点过于简单了:但是同步编程是如果你编写代码,从头到尾处理一个 HTTP 请求,并在一个线程或进程中执行,如果一个进程/一个线程只处理一个请求一次。

使用 python,特别是使用 asyncio 或使用 twisted 可以编写这样的代码,一个进程/线程可以处理多个请求。每当一个请求等待网络上的新数据被接收或一大块数据被发送出去时,它可以处理另一个请求,直到其他请求等待网络准备好。

Django 版本

然而,新的网络服务器/网络应用程序不仅可以处理 http 请求,还可以使用网络套接字。 Django 频道模块是为处理 Web 套接字而构建的。它是用 asyncio 实现的,它允许只用一个进程处理许多 web 套接字。它将通过消息(例如 redis)与 Django 的同步部分进行交互

附录:正如@Sayse 指出的那样,Django 3.0 将支持异步代码。 然而: 只有在我理解的情况下,ORM 操作仍然是同步的。它们将在异步事件循环中失败,并出现 SynchronousOnlyOperation 异常(或者必须将它们卸载到线程池)。所以可能大多数真实的 Django 视图都会失败或依赖于线程池,因为 Django 的原因之一是使用 ORM 进行数据库访问。

【讨论】:

我在分析器末尾添加了一些 cmets。 Words This is a little oversimplified 中的所有文本都是新的。 django 3.0 将支持asgi @Sayse ORM 操作仅在我理解的情况下仍将是同步的。它们将在带有 SynchronousOnlyOperation 异常的异步事件循环中失败。所以可能大多数请求作为 django 的原因之一是使用 ORM 仍将是同步的或为 ORM 部分调用线程。 我对“同步”在 django 中的含义感到困惑。这是否仅意味着其他请求必须等到当前请求完成?换句话说,在单个请求的处理中,我应该能够像正常一样生成线程和进程,并使用 asyncio 正确处理它们的结果? django

以上是关于【Python基础】http请求是同步还是异步?的主要内容,如果未能解决你的问题,请参考以下文章

在浏览器开发工具中检查 ajax 调用是同步的还是异步的

POST和GET以及同步请求和异步请求的区别

Django是同步的还是异步的?

基础入门_Python-网络编程.分分钟掌握阻塞/非阻塞/同步/异步IO模型?

python---tornado补充(异步非阻塞)

同步请求和异步请求的区别