django mysql 异步,Django ORM数据库查询会阻止服务器,还是异步的?

我只想澄清几件事。

我相信Django服务器是异步工作的(因为如果客户端发出的每个请求都将阻止服务器,那么它将无法正常工作),但是我也知道Django ORM不是异步的。 那么对数据库的查询会阻塞服务器吗? (我的意思是,其余请求正在等待查询完成?)或者它的工作原理完全不同,我误解了它。

我之所以这样问,是因为我听说大多数ORM都在阻塞,因此在不阻止Twisted的情况下,我无法在Twisted服务器中使用它们从db获取数据。

为什么服务器需要异步工作? Django是WSGI应用程序;并发模型取决于您在其中运行的服务器,并且可以是线程,多处理,异步(选择循环驱动)或这些的组合。

每个Django请求本身都是完全同步的。查询数据库将阻止请求,直到返回结果。它不需要知道其他并发请求(除了确保Django以线程安全的方式处理数据结构之外)。

然后我不明白一些简单的事情。我到处都听到异步的声音;同步,但Django已同步。它如何运作得如此好(我知道这可能是另一个SO问题的话题,但这让我感到困扰)。

这意味着我不会从Django异步向另一个服务发出请求,例如从RESTful API获取数据?

在执行大量I / O时,异步可能会更快,但也很难使用。但是,良好的缓存层有助于缓解差异。在标准Django中,没有什么可以帮助异步请求到外部RESTful API。您可以看一下Celery,这是一个很棒的异步工作程序架构,可以很好地与Django集成。

我从未尝试过同步编程。我一直都在凭直觉编写异步应用,并且很难想象它是如何工作的。感谢您的回答。还有一个问题,如果我将在django视图中向另一个站点发出同步请求,则django请求将一直等到我从该调用中获取数据,然后返回响应本身?我只想从django中调用twisted服务器来使twisted做些事情。

是的,如果您使用标准的urllib2库或requests(不支持异步),则该代码将同步运行,最终您将等待扭曲的服务器返回响应。

并且它不会阻止其他请求,因此我可以安全地将其用于服务器的许多请求吗?那就放心了。

现在,我想到了它,我之前是通过示例在线支付和致电PayPal来完成的。愚蠢的我。

这一定是我多年来在SO上见到的最钝的答案之一。一个专业级的系统将依赖于许多数据源,如SQL,memcache,s2s rpcs(随便命名)。如果这些事情可以并行完成,那么应该做到。甚至在相当基本的系统上,芹菜也会对管理任务进行批处理。如果要在处理一批行时消耗CPU,则希望下一批数据从数据源传输。 Django-坦率地说-很烂。线程是您的朋友。

@Sniggerfardimungus:当然,anat是为什么将WSGI服务器配置为使用线程和/或多处理的原因。问题是假设Django需要某种方式来处理并发性。它不是(不是开箱即用),而是留给了WSGI服务器(其中Django是插入该服务器的WSGI应用程序),而不是在请求处理程序中不添加异步处理,请参阅Django Workload项目异步示例的代码库。免责声明,我写了该代码。

我一直面临着您似乎遇到的类似问题。我的django应用程序执行了很多对rest服务的调用,以渲染视图,这让我感到困扰,他们不得不对它们进行序列化。

我开发了这个:

https://github.com/kowalski/featdjango/

这是基于扭曲Web的应用程序服务器。与django-twisted项目不同,它根本不使用wsgi。 Django代码在线程中运行。有他们的池。扭曲的代码在主应用程序线程中运行,并管理池。如果您需要从Django代码中进行一些调用并且可以从同时执行中受益,则需要创建一个方法,该方法返回Deferred(或DeferredList)。然后,从Django代码中,您可以通过以下方式调用它:

import threading

...

ct = threading.current_thread()

result = ct.wait_for_defer(method_to_call, *args, **kwargs)

这样的效果是,使用reactor.callFromThread()方法调用* method_to_call *,并绑定回调以唤醒调用者线程。返回Deferred的结果,或者引发异常(以防errback()被触发)。

我可能会在单独的计算机上运行django并扭曲,因此在我的情况下无法正常工作,但感谢您的回答。

这也是我的情况。我有一个django和扭曲的组件。但是,有时django视图需要执行多个不止一个扭曲命令。比我从我的解释中受益。

哦,我明白了。我对Twisted的请求不会超过一个,因此我很少会这样做。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值